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.mzph.cn/news/1175076.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大数据学习(1)

我完成了大数据学习的一部分,包括提示工程之类的,对于豆包和deepseek网页版为啥回复答案如此相似有了答案,并跟着教程完成了一个简陋的智能体,(虽说我觉得它现在只是一个智障体),它能够进行读写文件,还有从网上…

【小记】解决校园网中不同单播互通子网间 LocalSend 的发现问题

这回来折腾一下怎么在多播隔离、单播允许的局域网(比如校园网)子网之间实现 LocalSend 客户端的互相发现。各位好久不见~下半年又是忙论文又是忙项目的,实在是没什么时间更新笔记了。趁着今天有点空闲,咱来写写最近…

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

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

【计算机毕业设计案例】基于springboot的学车驾校线上学习理论学习考试管理系统的设计与实现(程序+文档+讲解+定制)

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

Springboot基于双减政策的家校互动管理系统8e613(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。

系统程序文件列表项目功能&#xff1a;家长,教师,学生信息,班级,班务活动,班级公告,校园资讯,计划安排,延时服务,参与服务,学生成绩,家长反馈,家长警告,教师警告,资讯类型,学校基础信息开题报告内容SpringBoot基于“双减”政策的家校互动管理系统开题报告一、研究背景与意义研究…

Java毕设选题推荐:基于springboot+vue的智慧城市化自修室管理系统【附源码、mysql、文档、调试+代码讲解+全bao等】

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

Springboot校园二手交易平台x9zo8(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。

系统程序文件列表项目功能&#xff1a;商品分类,出售专区,用户,求购专区开题报告内容SpringBoot校园二手交易平台开题报告一、选题背景与意义&#xff08;一&#xff09;选题背景在大学校园里&#xff0c;学生群体因学业周期更替、兴趣爱好变化、生活需求调整等因素&#xff0c…

【计算机毕业设计案例】基于springboot的城市化自修室座位预约管理系统(程序+文档+讲解+定制)

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

PCM缓冲区

“PCM 缓冲区”通常是指在数字音频处理中用于临时存储 脉冲编码调制(Pulse Code Modulation, PCM)数据的一段内存区域。 PCM 是最常见、最基础的未压缩数字音频格式,广泛应用于音频播放、录音、通信和音视频编解码等…

即插即用系列(代码实践)专栏介绍

把论文&#xff0c;真正变成你能直接用的代码 写在前面&#xff1a; 这篇文章不是为了“卖课”&#xff0c;而是想认真解释一件事—— 为什么我会花大量时间&#xff0c;把顶会论文拆成即插即用的代码模块。 如果你正好也在做科研、写论文、改网络结构&#xff0c;希望这篇文章…

实习 - tableau连接本地数据库

tableau 连接本地数据库需要下载对应的驱动器 ODBC, ODBC 驱动的安装路径和 MariaDB / MySQL 服务器的路径无关:ODBC 驱动 负责在 Tableau、Excel、Python 等工具和数据库之间建立通信; ODBC 驱动 不依赖于 服务器 的…

【小记】解决 LAN 中不同单播互通子网间 LocalSend 的发现问题

这回来折腾一下怎么在多播隔离、单播允许的局域网(比如校园网)子网之间实现 LocalSend 客户端的互相发现。各位好久不见~下半年又是忙论文又是忙项目的,实在是没什么时间更新笔记了。趁着今天有点空闲,咱来写写最近…

导师严选2026最新!专科生毕业论文一键生成工具TOP9测评

导师严选2026最新&#xff01;专科生毕业论文一键生成工具TOP9测评 2026年专科生毕业论文写作工具测评&#xff1a;功能与效率的深度解析 随着高校教育对学术规范要求的不断提升&#xff0c;专科生在撰写毕业论文时面临的挑战也日益增多。从选题构思到文献检索&#xff0c;从内…

Switch520游戏下载站 - 专业的switch游戏下载|ns免费游戏资源下载网站

在游戏资源获取领域&#xff0c;除了Steam、Epic等官方平台外&#xff0c;始终存在各类第三方资源聚合网站。Switch520​ 以其"完全免费"的定位和丰富的游戏库吸引用户&#xff0c;但此类平台的技術实现和合规性值得深入探讨。 网站地址&#xff1a;点击访问 一、网…

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

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

【毕业设计】基于springboot的城市化自修室管理系统(源码+文档+远程调试,全bao定制等)

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

Java毕设项目:基于springboot的城市化自修室管理系统(源码+文档,讲解、调试运行,定制等)

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

轮廓线DP - 学习笔记

轮廓线DP 1. 概述 1.1 什么是轮廓线DP 轮廓线DP是一种针对二维网格类问题的动态规划优化方法。当处理 \(n \times m\) 网格的逐行逐列决策问题时,其核心思想是用一个状态变量表示轮廓线的信息——即当前决策位置左侧和…

GESP认证C++编程真题解析 | 202409 三级

​欢迎大家订阅我的专栏:算法题解:C++与Python实现! 本专栏旨在帮助大家从基础到进阶 ,逐步提升编程能力,助力信息学竞赛备战! 专栏特色 1.经典算法练习:根据信息学竞赛大纲,精心挑选经典算法题目,提供清晰的…

OTG数据与充电交互解决方案专家乐得瑞

PD充电与数据传输同时实现主要依托PD芯片和TYPE - C PD协议等技术。 PD芯片具备智能充电与双向高速数据传输的能力&#xff0c;打破了以往充电接口与数据传输接口分离的束缚&#xff0c;实现了充电与数据传输的一体化。用户使用一根Type - C数据线&#xff0c;就能轻松完成设备…