news 2026/4/14 2:45:25

java常用容器源码手撕实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
java常用容器源码手撕实现

java常用容器源码手撕(持续更新)

ArrayList:

动态数组,扩容,迭代器

packagetech.insight;importjava.util.Iterator;importjava.util.NoSuchElementException;importjava.util.Objects;/** * @author gongxuanzhangmelt@gmail.com **/publicclassArrayList<E>implementsList<E>{privateObject[]table=newObject[10];privateintsize;@Overridepublicvoidadd(Eelement){if(size==table.length){resize();}table[size]=element;size++;}privatevoidresize(){Object[]newTable=newObject[table.length*2];System.arraycopy(table,0,newTable,0,table.length);this.table=newTable;}@Overridepublicvoidadd(Eelement,intindex){if(index<0||index>size){thrownewIndexOutOfBoundsException();}if(size==table.length){resize();}System.arraycopy(table,index,table,index+1,size-index);table[index]=element;size++;}@OverridepublicEremove(intindex){if(index<0||index>=size){thrownewIndexOutOfBoundsException();}EremoveElement=(E)table[index];System.arraycopy(table,index+1,table,index,size-index-1);size--;table[size]=null;returnremoveElement;}@Overridepublicbooleanremove(Eelement){for(inti=0;i<size;i++){if(Objects.equals(element,table[i])){remove(i);returntrue;}}returnfalse;}@OverridepublicEset(intindex,Eelement){if(index<0||index>=size){thrownewIndexOutOfBoundsException();}EoldValue=(E)table[index];table[index]=element;returnoldValue;}@OverridepublicEget(intindex){if(index<0||index>=size){thrownewIndexOutOfBoundsException();}return(E)table[index];}@Overridepublicintsize(){returnsize;}@OverridepublicIterator<E>iterator(){returnnewArrayListIterator();}classArrayListIteratorimplementsIterator<E>{intcursor;@OverridepublicbooleanhasNext(){returncursor!=size;}@OverridepublicEnext(){if(cursor>=size){thrownewNoSuchElementException();}Eelement=(E)table[cursor];cursor++;returnelement;}}}

LinkedList:

迭代器

packagetech.insight;importjava.util.Iterator;importjava.util.NoSuchElementException;importjava.util.Objects;/** * @author gongxuanzhangmelt@gmail.com **/publicclassLinkedList<E>implementsList<E>{privateintsize;privateNode<E>head;privateNode<E>tail;@Overridepublicvoidadd(Eelement){Node<E>node=newNode<>(tail,element,null);if(tail!=null){tail.next=node;}else{head=node;}tail=node;size++;}@Overridepublicvoidadd(Eelement,intindex){if(index<0||index>size){thrownewIndexOutOfBoundsException();}if(index==size){add(element);return;}Node<E>indexNode=findNode(index);Node<E>pre=indexNode.pre;Node<E>node=newNode<>(pre,element,indexNode);if(pre==null){head=node;}else{pre.next=node;}indexNode.pre=node;size++;}privateNode<E>findNode(intindex){Node<E>result=null;if(index<size/2){result=head;for(inti=0;i<index;i++){result=result.next;}}else{result=tail;for(inti=size-1;i>index;i--){result=result.pre;}}returnresult;}@OverridepublicEremove(intindex){if(index<0||index>=size){thrownewIndexOutOfBoundsException();}returnremoveNode(findNode(index));}privateEremoveNode(Node<E>node){Node<E>pre=node.pre;Node<E>next=node.next;if(pre==null){head=next;}else{pre.next=next;}if(next==null){tail=pre;}else{next.pre=pre;}node.pre=null;node.next=null;size--;returnnode.value;}@Overridepublicbooleanremove(Eelement){Node<E>node=head;while(node!=null){if(Objects.equals(node.value,element)){removeNode(node);returntrue;}node=node.next;}returnfalse;}@OverridepublicEset(intindex,Eelement){if(index<0||index>=size){thrownewIndexOutOfBoundsException();}Node<E>node=findNode(index);EoldValue=node.value;node.value=element;returnoldValue;}@OverridepublicEget(intindex){if(index<0||index>=size){thrownewIndexOutOfBoundsException();}returnfindNode(index).value;}@Overridepublicintsize(){returnsize;}@OverridepublicIterator<E>iterator(){returnnewLinkedListIterator();}classLinkedListIteratorimplementsIterator<E>{Node<E>node=head;@OverridepublicbooleanhasNext(){returnnode!=null;}@OverridepublicEnext(){if(node==null){thrownewNoSuchElementException();}Eresult=node.value;node=node.next;returnresult;}}classNode<E>{Node<E>pre;Node<E>next;Evalue;publicNode(Evalue){this.value=value;}publicNode(Node<E>pre,Evalue,Node<E>next){this.pre=pre;this.value=value;this.next=next;}}}

HashMap:

拉链法解决哈希冲突,以及扩容机制

packagetech.insight;/** * @author gongxuanzhangmelt@gmail.com **/publicclassMyHashMap<K,V>{privateNode<K,V>[]table=newNode[16];privateintsize=0;publicVput(Kkey,Vvalue){intkeyIndex=indexOf(key);Node<K,V>head=table[keyIndex];if(head==null){table[keyIndex]=newNode<>(key,value);size++;resizeIfNecessary();returnnull;}while(true){if(head.key.equals(key)){VoldValue=head.value;head.value=value;returnoldValue;}if(head.next==null){head.next=newNode<>(key,value);size++;resizeIfNecessary();returnnull;}head=head.next;}}publicVget(Kkey){intkeyIndex=indexOf(key);Node<K,V>head=table[keyIndex];while(head!=null){if(head.key.equals(key)){returnhead.value;}head=head.next;}returnnull;}publicVremove(Kkey){intkeyIndex=indexOf(key);Node<K,V>head=table[keyIndex];if(head==null){returnnull;}if(head.key.equals(key)){table[keyIndex]=head.next;size--;returnhead.value;}Node<K,V>pre=head;Node<K,V>current=head.next;while(current!=null){if(current.key.equals(key)){pre.next=current.next;size--;returncurrent.value;}pre=pre.next;current=current.next;}returnnull;}privatevoidresizeIfNecessary(){if(this.size<table.length*0.75){return;}Node<K,V>[]newTable=newNode[this.table.length*2];for(Node<K,V>head:this.table){if(head==null){continue;}Node<K,V>current=head;while(current!=null){intnewIndex=current.key.hashCode()&(newTable.length-1);if(newTable[newIndex]==null){newTable[newIndex]=current;Node<K,V>next=current.next;current.next=null;current=next;}else{Node<K,V>next=current.next;current.next=newTable[newIndex];newTable[newIndex]=current;current=next;}}}this.table=newTable;System.out.println("扩容了,扩容到"+this.table.length);}publicintsize(){returnsize;}privateintindexOf(Objectkey){returnkey.hashCode()&(table.length-1);}classNode<K,V>{Kkey;Vvalue;Node<K,V>pre;Node<K,V>next;publicNode(Kkey,Vvalue){this.key=key;this.value=value;}}}

注意:这里只是简单实现了类似jdk1.7之前的hashmap,没涉及到红黑树的树化和反树化

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/13 6:13:05

Java毕设项目推荐-基于springboot的学车超能驾校线上学习管理系统学车预约、考试信息、考试预约、考试成绩、课时充值的设计与实现【附源码+文档,调试定制服务】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/4/10 20:26:47

day137—链表—删除链表中的结点(LeetCode-237)

题目描述有一个单链表的 head&#xff0c;我们想删除它其中的一个节点 node。给你一个需要删除的节点 node 。你将 无法访问 第一个节点 head。链表的所有值都是 唯一的&#xff0c;并且保证给定的节点 node 不是链表中的最后一个节点。删除给定的节点。注意&#xff0c;删除节…

作者头像 李华
网站建设 2026/4/7 22:46:18

Java毕设选题推荐:基于vue的博客分享发布系统基于springboot的博客系统【附源码、mysql、文档、调试+代码讲解+全bao等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/4/12 13:09:04

【计算机毕业设计案例】基于python-CNN卷神经网络训练识别手势方向

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/3/27 18:44:40

ASCOMP PC Internals Pro(系统分析与硬盘监控)

链接&#xff1a;https://pan.quark.cn/s/b7f174263e7cASCOMP PC Internals Pro是一款专业级 Windows 系统分析与硬盘监控工具。该软件适用于个人用户、IT 专业人士以及注重系统透明度、早期故障检测和数据安全的零售商。通过一键操作&#xff0c;用户即可获取处理器、内存、显…

作者头像 李华
网站建设 2026/4/13 23:38:28

MySQL的一张表使用InnoDB引擎,创建时如果忘记给这张表添加主键,请问这边表有没有聚簇索引?如果有的话聚簇索引是什么样的?

聚簇索引创建的原则&#xff1a;主键存在&#xff1a;如果表中定义了主键&#xff0c;主键即为聚簇索引。没有主键时&#xff1a;如果没有定义主键&#xff0c;InnoDB 会选择第一个唯一且非空的索引作为聚簇索引。既没有主键也没有唯一索引时&#xff1a;如果既没有主键也没有合…

作者头像 李华