从零手写顺序表到深入理解ArrayList:Java数据结构核心实践指南

发布时间:2026/11/4 23:08:19

从零手写顺序表到深入理解ArrayList:Java数据结构核心实践指南 顺序表理解顺序表在物理内存结构是连续的 通常用数组 完成增删查改 我们需要删除和修改的时候 必须要遍历整个数组 效率不高 于是引出来链表顺序表的模拟package Book3;import java.util.ArrayList;import java.util.Arrays;import java.util.List;public class nn{private int[] array;//数组private int size;//数组个数private int a10;// 默认构造方法nn(){// 将顺序表的底层容量设置为initcapacity//数组初始化this.size0;this.arraynew int[a];}//扩容数组private void k(){array Arrays.copyOf(this.array,2*this.array.length);}//判断是否满// 新增元素,默认在数组最后新增public void add(int data) {//先判断是否满 如果没有满则直接写入if(this.size1array.length){k();}array[this.size]data;this.size;}private void zuobiao(int pos) throws zuobiao{if(pos0||possize){System.out.println(坐标插入不合法,请输入0到size的数);throw new zuobiao(坐标位置不合法);}}//在 pos 位置新增元素public void add(int pos, int data) {//先检查拆入的坐标合法性zuobiao(pos);this.array[pos]data;this.size;}// 判定是否包含某个元素public boolean contains(int toFind) {for (int i 0; i this.size; i) {if (array[i]toFind){System.out.println(找到了);return true;}}return false;}// 查找某个元素对应的位置public int indexOf(int toFind) {for (int i 0; i this.size; i) {if (array[i]toFind){System.out.println(对应的坐标 i);return i;}}return -1; }// 获取 pos 位置的元素public int get(int pos) {//先判断输入的坐标的合法性zuobiao(pos);return array[pos];}// 给 pos 位置的元素设为 valuepublic void set(int pos, int value) {zuobiao(pos);this.array[pos]value;}//删除第一次出现的关键字keypublic void remove(int toRemove) {int b0;for (int i 0; i this.size; i) {if(array[i]toRemove){bi;break;}}for (int i b; i size-1; i) {array[i]array[i1];}this.size--;}//获取顺序表长度public int size() { return array.length; }// 清空顺序表public void clear() {this.size0;}// 打印顺序表注意该方法并不是顺序表中的方法为了方便看测试结果给出的public void display() {//判断数组是否为空if(this.size0){System.out.println(数组为空);return;}for (int i0;ithis.size;i){System.out.println(this.array[i]);}}//int indexOf(Object o) 返回第一个 o 所在下标public int frinstindexof1(int o){for (int i 0; i this.size; i) {if(array[i]o){System.out.println(找到了o下标为i);return i;}}return 0;}//int lastIndexOf(Object o) 返回最后一个 o 所在下标public int lastIndexof(int a){for (int isize; i 0 ; i--) {if (aarray[i]){System.out.println(找到了下标为i);return i;}}return 0;}// ListE subList(int fromIndex, int toIndex) 截取部分 list//左闭右开public List subList(int qishi,int jieshu){zuobiao(qishi);zuobiao(jieshu);List anew ArrayList();for (int i qishi; i jieshu-qishi ; i) {a.add(array[i]);}return a;}}class mm{public static void main(String[] args) {nn nnew nn();n.add(1);n.add(1);n.add(2);n.add(2);n.add(3);n.lastIndexof(2);System.out.println(n.subList(1, 3));}}ArraryListArrayListInteger anew ArrayList(); //无参构造 a.add(1); a.add(2); a.add(3); a.add(4); //有参构造 ArrayListInteger bnew ArrayList(a); System.out.println(b); //初始化数组容量 ArrayListInteger cnew ArrayList(20); System.out.println(c);1. ArrayList是以泛型方式实现的使用时必须要先实例化2. ArrayList实现了RandomAccess接口表明ArrayList支持随机访问3. ArrayList实现了Cloneable接口表明ArrayList是可以clone的4. ArrayList实现了Serializable接口表明ArrayList是支持序列化的5.和Vector不同ArrayList不是线程安全的在单线程下可以使用在多线程中可以选择Vector或者CopyOnWriteArrayList6. ArrayList底层是一段连续的空间并且可以动态扩容是一个动态类型的顺序表ArryaryList使用ArrayList cnew ArrayListInteger(); c.add(1); System.out.println(c);顺序表add运行底层 扩容机制顺序表中的数组是怎么给定容量 在什么时候给定容量的第一次进行分配空间是10如果数组存满的话则返回的个数1 11数组容量变为10如果不够以1.5倍扩容如果在不够 以用户实际为标准扩容//三种遍历顺序表的方式//for循环for (int i 0; i c.size(); i) {System.out.println(c.get(i));}//earhfor (Integer integer:c){System.out.println(integer);}//迭代器IteratorInteger f c.listIterator();//向前向后遍历的迭代器 接收while (f.hasNext()){//hasnext判断后面是否有元素System.out.println(f.next());//next指向下一个元素顺序表的优缺点分析优点支持快速随机访问、无需额外存储指针、缓存命中率高。缺点插入删除效率低、扩容成本高、需预分配空间可能导致浪费。
延伸阅读

更多相关文章

2026/11/1 22:31:17

滑动窗口算法实战:无重复字符最长子串详解与多语言实现

算法实战:无重复字符的最长子串详解在面试和算法竞赛中,"无重复字符的最长子串"是一个经典且高频出现的题目。很多开发者在初次接触时容易陷入暴力求解的思维定式,导致时间复杂度居高不下。本文将系统讲解滑动窗口算法的核心思想&a…

2026/11/4 23:06:20

Audio学习9(AudioFlinger/HAL)

1 环境 这次主要是看看audio在安卓平台的实现,用是瑞芯微RK3568开发板。 本来是想还是用之前的WM8960模块,但是很无语发现它板子上的I2S接口并没有引出来。引出的口只有I2C,SPI,还有UART。 和之前用的WM8960比较一下:…

2026/11/4 23:06:20

记录系统即权力:智能体时代企业底座迁移与决策权再分配

【摘要】以a16z 2026年10月发布的万字分析为核心依据,梳理4轮计算范式下的权力转移规律,结合Databricks年化收入70亿美元、智能体日均启动1700万个数据库的行业样本,拆解记录系统三权重构的底层逻辑,明确3类可量化失效边界&#x…

2026/11/4 23:06:20

第十章 GPU 虚拟地址空间管理:10.9 本章小结

1. 本章小结 本章讨论了 GPU 虚拟地址空间的管理。与 CPU 内存管理对照可以看出,GPU 内存管理在结构上沿用了地址空间、后备存储、反向映射与回收的分层,差异来自四项约束: 管理单位是 BO 而不是页; 多数 GPU 不能在作业执行中从缺页恢复,映射必须预先建立; 页表写入与数…

2026/11/4 23:01:19

年底还在招的岗位,先确认缺口和到岗要求

十一月看到一个技术岗位,不要仅凭「年底还在招」判断机会好坏。先确认缺口是否明确、流程由谁推进、希望何时到岗。岗位发布时间只能说明页面上有这条信息,不能替你回答团队现在需要什么人。 准备跳槽的人往往同时安排项目收尾、面试和个人行程。如果岗位…

2026/11/4 12:38:23

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/4 21:04:25

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/4 0:03:20

AI辅助技术栈评估:提升研发决策效率60%

1. 项目背景与核心价值技术决策一直是研发团队面临的重大挑战。随着技术生态的快速演进,技术栈的选择、维护和迭代变得愈发复杂。我们团队在过去两年里,先后经历了三次重大技术栈迁移,每次都需要投入大量人力进行技术评估和风险分析。直到去年…

2026/11/4 0:03:20

从生成Token到直接决策:Jev如何重塑AI Agent工程实践

1. 从"生成文字"到"拍板决策":Jev 到底在解决什么问题大多数人第一次接触大模型,脑子里建立的模型是"输入问题、输出文字"。你问它今天天气怎么样,它给你一段描述;你让它写个周报,它给你…

2026/11/4 0:03:20

32G统一内存跑大模型:内存账、TPS实测与端云分流

想在一台 32G 统一内存的小主机上把大模型跑成"日常可用",这件事我前后折腾了小半年。标题里说的这台 Mac mini M6,是我们这次讨论的目标平台,具体到手规格以实物为准;但下面这套推算方法和实测思路,对任何统…

2026/11/4 12:38:23

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/4 21:04:25

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑