【Java ArrayList】底层方法的自我实现

【Java ArrayList】底层方法的自我实现
在这里插入图片描述
🎁个人主页:User_芊芊君子
🎉欢迎大家点赞👍评论📝收藏⭐文章
🔍系列专栏:Java.数据结构
在这里插入图片描述


在这里插入图片描述


【前言】
ArrayList是Java集合框架中List接口的动态数组实现,可以方便的存储和操作数据。它提供了一系列方法,便于我们进行增删查改,这篇文章是进行ArrayList的一个自我实现,让我们从底层更深度地理解ArrayList(顺序表)

文章目录:

一、 定义ArrayList类

arr : 创建一个整型数组,用来存储数据; usedSize : 有效数据,也就是真实的元素个数;
DEFAULT_CAPACITY:默认数组容量
MyArrayList():构造方法,初始化数组长度为默认的容量
publicclassMyArrayListimplementsIList{privateint[] arr;//存储数据privateint usedSize;//有效数据个数publicstaticfinalint DEFAULT_CAPACITY =10;//默认数组容量publicMyArrayList(){this.arr =newint[DEFAULT_CAPACITY];}

二、常见方法实现

ArrayList的常见方法如下:

在这里插入图片描述

1.add(int data):新增元素,添加在数组后面

publicvoidadd(int data){//判断顺序表是否满了if(isFull()){//扩容grow();}//存储this.arr[this.usedSize]= data;this.usedSize++;}publicbooleanisFull(){returnthis.usedSize ==this.arr.length;}publicvoidgrow(){this.arr =Arrays.copyOf(this.arr,2*this.arr.length);}
添加元素时,要先检查数组是否已满(isFull() 通过比较数组的长度和元素个数),如果满了,就要进行扩容grow(),这里是copy两倍的数组容量,然后再进行存储

2.add(int pos, int data):再pos位置添加元素

publicvoidadd(int pos,int data){//检查是不是满的if(isFull()){grow();}checkPos(pos,"add方法执行的时候pos位置不合法");//判断是不是放在usedSize位置if(pos == usedSize){ arr[pos]= data; usedSize++;return;}//如果放在前面,就要移动数据for(int i = usedSize-1; i >= pos; i++){ arr[i+1]= arr[i];} arr[pos]= data; usedSize++;}privatevoidcheckPosAdd(int pos,String msg){if(pos <0|| pos > usedSize){thrownewPosIllegalityException(msg);}}
在这里插入图片描述
还是先要检查容量是否已满isFull(),满了就要进行扩容grow(),然后添加时,要先检查pos位置是否合法,如上图,pos < 0 || pos > usedSize就是不合法的,在这个范围则会抛出我们自定义的PosIllegalityException异常,正常情况下进行添加:将pos位置及后面的元素统统向后移动一个位置,为要添加的元素腾出位置,然后有效数据usedSize++

3.contains(int toFind):判断是否包含某个元素

publicbooleancontains(int toFind){for(int i =0; i <this.usedSize; i++){if(arr[i]== toFind){returntrue;}}returnfalse;}
使用for循环遍历整个数组,if语句判断当前元素是否是你要找的元素toFind,是返回true,不是返回false

4.indexOf(int toFind):查找某个元素对应的位置

publicintindexOf(int toFind){for(int i =0; i <this.usedSize; i++){if(arr[i]== toFind){return i;}}return-1;}
同理:使用for循环遍历整个数组,if语句判断当前元素是否是你要找的元素toFind,是返回对应元素的下标i,不是返回-1

5.get(int pos):获取pos位置的元素

publicintget(int pos){if(isEmpty()){thrownewEmptyListException("当前顺序表为空");}checkPos(pos,"get方法的pos位置不合法");return arr[pos];}privatevoidcheckPos(int pos,String msg){if(pos<0|| pos >= usedSize){thrownewPosIllegalityException(msg);}}publicbooleanisEmpty(){return usedSize ==0;}
获取元素,先检查pos位置是否为空isEmpty(),如果为空,抛出我们的自定义异常EmptyListException,然后检查pos位置是否合法pos<0 || pos >= usedSize这个范围就是不合法的,抛出我们的自定义异常PosIllegalityException,最后就可以返回pos位置的元素

6.set(int pos, int value):给pos位置的元素设为value

publicvoidset(int pos,int value){if(isEmpty()){thrownewEmptyListException("当前顺序表为空");}checkPos(pos,"set方法执行的时候pos位置不合法"+pos); arr[pos]= value;}
替换时要先检查是否为空isEmpty(),为空抛出自定义异常EmptyListException,不为空检查pos位置是否合法,最后将给定的值替换指定的数组元素

7.remove(int toRemove):删除第⼀次出现的关键字key

publicvoidremove(int toRemove){if(isEmpty()){thrownewEmptyListException("当前顺序表为空");}//查找要删除数据的下标int index =indexOf(toRemove);if(index ==-1){System.out.println("没有你要删除的数据");return;}for(int i = index; i < usedSize-1; i++){ arr[i]= arr[i+1];} usedSize--;}//arr[usedSize] = null;如果是引用类型,需要手动置空
在这里插入图片描述
还是先检查是否为空,然后可以通过indexOf(toRemove)查找要删除的元素,如果index == -1,则没有你要删除的元素,如果有,进行覆盖删除,让后面的元素逐一向前移动一个位置直到你要,直到覆盖掉你要删除的元素,最后将有效元素usedSize–

8.size():获取顺序表⻓度

publicintsize(){returnthis.usedSize;}

9.clear():清空顺序表

publicvoidclear(){for(int i =0; i <this.usedSize; i++){ arr[i]=0;} usedSize =0;}

三、总结

这篇文章只是从深度的实现了一下ArrayList提供的一系列方法,以便于更好地去理解和使用ArrayList,让我们认识到了,数据结构的学习和使用,要考虑到所有方面,对我们的逻辑思维能力要求很高,同样也会提高我们这方面的能力,相关的其他内容后面会详细道来

Read more

【算法精讲】深度优先搜索(DFS),一文带你彻底掌握!✨

【算法精讲】深度优先搜索(DFS),一文带你彻底掌握!✨

前言 亲爱的同学们,大家好!👋 今天我要和大家分享一个在算法世界中非常重要的搜索策略——深度优先搜索(Depth-First Search, DFS)。作为一名编程老师,我经常看到很多同学在面对图论和树的遍历问题时感到困惑,特别是当需要选择合适的搜索策略时。🤔 深度优先搜索就像是探险家在迷宫中的探索,总是沿着一条路径走到尽头,才会返回尝试其他路径。这种"一条路走到黑"的策略在解决许多实际问题中非常有效!今天,我们将一起深入了解DFS的原理、实现和应用,让你在算法的世界里多一把利器!💪 准备好开启这段探索之旅了吗?让我们一起出发吧!🚀 知识点说明 1. DFS的基本概念 深度优先搜索(DFS)是一种用于遍历或搜索树或图的算法。它的核心思想是:从起始节点开始,尽可能深入地探索一条路径,直到无法继续为止,然后回溯到前一个节点,继续探索其他未访问的路径。📝 DFS的三个关键特点: * 优先深度:算法会尽可能深入地探索一条路径,而不是广泛地探索所有可能的路径 * 使用栈:DFS通常使用栈(或递归,隐式使用系统栈)来记住探索过程中的节点 * 回溯:当无法继续深入时

By Ne0inhk
Flutter 三方库 matrix 鸿蒙终端底层复杂超维数学算力适配突破:无缝植入极限级张量系统与密集线性代数矩阵运算推演算法,解锁端侧图形处理边界-适配鸿蒙 HarmonyOS ohos

Flutter 三方库 matrix 鸿蒙终端底层复杂超维数学算力适配突破:无缝植入极限级张量系统与密集线性代数矩阵运算推演算法,解锁端侧图形处理边界-适配鸿蒙 HarmonyOS ohos

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 matrix 鸿蒙终端底层复杂超维数学算力适配突破:无缝植入极限级张量系统与密集线性代数矩阵运算推演算法,全面解锁端侧图形视觉处理边界并拔高数据分析算力上限 在图形学渲染、物理引擎模拟、复杂地理坐标转换以及端侧小型机器学习框架中,底层的矩阵运算(Matrix Operations)是决速步骤。matrix 库是一个专注于高性能线性代数计算的 Dart 库。本文将详解该库在 OpenHarmony 环境下的适配与实战应用。 封面 前言 什么是 matrix?它为 Dart 提供了一套类似于 NumPy 的多维数组运算接口。在鸿蒙操作系统这种强调极致流畅度和复杂视觉动效的系统中,利用高效的矩阵算法可以显著提升自定义 Canvas 绘图或实时传器数据处理的性能,避免因 Dart 层的低效循环导致的 UI 掉帧。 一、原理解析 1.1 基础概念 matrix 库核心基于

By Ne0inhk
华为OD机试 双机位C卷 双机位B卷 双机位A卷 2025C卷 2025B卷 真题题库目录|机考题库 + 算法考点详解

华为OD机试 双机位C卷 双机位B卷 双机位A卷 2025C卷 2025B卷 真题题库目录|机考题库 + 算法考点详解

华为OD机试真题题库目录 华为OD机试2025年11月19号机试切换至 (华为OD机试双机位C卷)机试时随机抽取,近期准备华为OD机试的 双机位C卷 真题,通过率将大大提升. 本专栏所有算法题全部包含详细的思路讲解以及C语言、JS、C++、Python、Go、java 源码实现。订阅专栏之后可以私信我开通OJ权限。 华为OD面试手撕代码真题目录,点击查看 华为OD技术面八股真题目录,点击查看 华为OD机试双机位C卷- 100分 序号题目考点 or 实现在线OJ地址1华为OD机试双机位C卷 - 补种未成活胡杨双指针点击去做题2华为OD机试双机位C卷 - 查找接口成功率最优时间段前缀和点击去做题3华为OD机试双机位C卷 - 螺旋数字矩阵模拟、逻辑分析点击去做题4华为OD机试双机位C卷 - 运维日志排序正则、排序点击去做题5华为OD机试双机位C卷 - 比赛模拟、排序点击去做题6华为OD机试双机位C卷 - 打印机队列优先队列点击去做题7华为OD机试双机位C卷 - 微服务的集成测试DFS、哈希表点击去做题8华为OD机试双机位C卷 - 完美走位双指针点击去做题9华为OD机试双机位C卷

By Ne0inhk
每日精讲:环形链表、两个数组中的交集、随机链表的复制

每日精讲:环形链表、两个数组中的交集、随机链表的复制

Hello大家好! 很高兴与大家见面! 给生活添点快乐,开始今天的编程之路。 我的博客:<但愿. 我的专栏:C语言、题目精讲、算法与数据结构、C++ 欢迎点赞,关注 一 环形链表 1.1题目链接:环形链表II 1.2题目描述: 给定一个链表的头节点  head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。注意不允许修改 链表。

By Ne0inhk