当前位置: 首页 > news >正文

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,没涉及到红黑树的树化和反树化

http://www.jsqmd.com/news/259710/

相关文章:

  • 0.传感器及常用模块总结
  • Springboot基于双减政策的家校互动管理系统8e613(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
  • 聚焦AI原生应用领域的自然语言理解前沿
  • 【计算机毕业设计案例】基于springboot的学车驾校线上学习理论学习考试管理系统的设计与实现(程序+文档+讲解+定制)
  • 计算机Java毕设实战-基于springboot的城市图书馆自修室管理系统【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 导师推荐10个AI论文平台,本科生搞定毕业论文!
  • YUV缓冲区
  • TDengine C# 语言连接器入门指南
  • 基于STM32的智能宠物喂食系统设计与实现
  • 解码WIFI模块与IoT云平台
  • 大数据学习(1)
  • 【小记】解决校园网中不同单播互通子网间 LocalSend 的发现问题
  • 【计算机毕业设计案例】基于springboot的城市化自修室座位预约管理系统(程序+文档+讲解+定制)
  • Springboot校园二手交易平台x9zo8(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
  • PCM缓冲区
  • 即插即用系列(代码实践)专栏介绍
  • 实习 - tableau连接本地数据库
  • 【小记】解决 LAN 中不同单播互通子网间 LocalSend 的发现问题
  • 导师严选2026最新!专科生毕业论文一键生成工具TOP9测评
  • Switch520游戏下载站 - 专业的switch游戏下载|ns免费游戏资源下载网站
  • 【课程设计/毕业设计】基于Java+SpringBoot城市化自修室管理系统基于springboot的城市化自修室管理系统【附源码、数据库、万字文档】
  • 【毕业设计】基于springboot的城市化自修室管理系统(源码+文档+远程调试,全bao定制等)
  • 轮廓线DP - 学习笔记
  • Java毕设项目:基于springboot的城市化自修室管理系统(源码+文档,讲解、调试运行,定制等)
  • GESP认证C++编程真题解析 | 202409 三级
  • OTG数据与充电交互解决方案专家乐得瑞
  • 题解:P14270 ABC253Ex 加强版
  • LDR6021Q实现充电加数据传输一个Type-c接口实现多功能同时进行
  • Git 入门:给你的代码装上“时光机”
  • GoldenGate 19C的静默安装及打补丁 - 详解