news 2026/4/15 15:29:36

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/8 18:17:04

【课程设计/毕业设计】基于Java+SpringBoot城市化自修室管理系统基于springboot的城市化自修室管理系统【附源码、数据库、万字文档】

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

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

Apache Atlas vs DataHub:主流数据目录工具对比评测

Apache Atlas vs DataHub&#xff1a;主流数据目录工具对比评测关键词&#xff1a;数据目录、元数据管理、Apache Atlas、DataHub、对比评测、企业级数据治理、数据发现 摘要&#xff1a;本文深入对比分析Apache Atlas与DataHub两大主流数据目录工具&#xff0c;从技术架构、核…

作者头像 李华
网站建设 2026/4/8 11:37:52

2 Mbps 到千兆级:WiFi 驱动工业场景的全面升级

回顾 WiFi 的发展历程&#xff0c;已从早期 2 Mbps 的 802.11b 基础版本&#xff0c;发展到如今的高性能 WiFi 5/6&#xff0c;具备更高带宽、/更低时延和更强的并发能力。这一演进不仅改变了大众的生活与娱乐方式&#xff0c;更为工业场景带来了前所未有的灵活性与可扩展性&am…

作者头像 李华
网站建设 2026/4/3 3:21:00

计算机Java毕设实战-基于springboot的学车驾校科目一模拟考试线上学习管理系统的设计与实现【完整源码+LW+部署说明+演示视频,全bao一条龙等】

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

作者头像 李华