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/16 12:05:23

导师推荐10个AI论文平台,本科生搞定毕业论文!

导师推荐10个AI论文平台&#xff0c;本科生搞定毕业论文&#xff01; AI 工具助力论文写作&#xff0c;高效又省心 对于大多数本科生而言&#xff0c;毕业论文是大学阶段最具挑战性的任务之一。从选题到开题、撰写再到查重降重&#xff0c;每一个环节都可能让人感到压力山大。而…

作者头像 李华
网站建设 2026/4/16 10:21:24

Maven 依赖作用域实战避坑指南

在 Maven 项目开发中&#xff0c;依赖作用域的配置直接影响项目的编译、测试和打包结果&#xff0c;稍有不慎就会引发 ClassNotFoundException、依赖包冗余等问题。结合日常开发场景&#xff0c;本文整理了常见的作用域使用误区和解决方案&#xff0c;帮你精准避坑。一、 高频误…

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

豆包Ai指令85

链接&#xff1a;https://pan.quark.cn/s/2e58220cd806一份专为字节跳动豆包AI设计的实用指令与提示词合集&#xff0c;收录85条经过验证的常用模板。涵盖写作、编程、分析、营销等多个场景&#xff0c;助您快速掌握与AI高效协作的技巧&#xff0c;解锁更多深度功能与创意玩法。…

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

从嵌入式转向 FPGA,他用 6 个月拿下 15K Offer|真实学员回访

这是学员 L 同学 在入职当天给我们发来的第一句话&#xff1a;“不是嵌入式不好&#xff0c;是我发现自己更适合 FPGA。”他并不是应届生&#xff0c;而是一名有 2 年嵌入式开发经验 的工程师。 从 STM32、RTOS&#xff0c;到驱动调试、板级联调&#xff0c;他都做过&#xff0…

作者头像 李华