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

发布时间:2026/9/13 7:09:11

从零手写顺序表到深入理解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/9/11 9:41:36

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

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

2026/9/13 7:07:23

运算放大器设计实战:虚短虚断、11种经典电路与稳定性分析

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

2026/9/13 7:07:23

如何为 GitHub 账户添加 passkey 并用附近设备完成登录

如何为 GitHub 账户添加 passkey 并用附近设备完成登录 【免费下载链接】docs The open-source repo for docs.github.com 项目地址: https://gitcode.com/GitHub_Trending/do/docs 这篇文章面向想要摆脱密码登录的 GitHub 账户使用者:先为自己的账户注册一个…

2026/9/13 7:07:23

门控注意力机制优化大语言模型性能与效率

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

2026/9/13 0:01:16

拯救者Y7000黑屏故障排查与维修实战指南

1. 项目概述:一台黑屏的拯救者Y7000,到底卡在哪一步? 联想拯救者Y7000系列笔记本,从2018年第一代搭载i5-8300H开始,到后来的i7-9750H、i7-10750H、i5-11400H,再到2023年款的R7-7840HS,它始终是学…

2026/9/13 0:01:16

拯救者Y7000黑屏故障排查与维修实战指南

1. 项目概述:一台黑屏的拯救者Y7000,到底卡在哪一步? 联想拯救者Y7000系列笔记本,从2018年第一代搭载i5-8300H开始,到后来的i7-9750H、i7-10750H、i5-11400H,再到2023年款的R7-7840HS,它始终是学…

2026/9/12 6:29:36

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/12 14:32:17

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/12 6:37:43

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

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

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

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