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

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

在这里插入图片描述

🎁个人主页:User_芊芊君子
🎉欢迎大家点赞👍评论📝收藏⭐文章
🔍系列专栏:Java.数据结构

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

文章目录:

  • 一、 定义ArrayList类
  • 二、常见方法实现
    • 1.add(int data):新增元素,添加在数组后面
    • 2.add(int pos, int data):再pos位置添加元素
    • 3.contains(int toFind):判断是否包含某个元素
    • 4.indexOf(int toFind):查找某个元素对应的位置
    • 5.get(int pos):获取pos位置的元素
    • 6.set(int pos, int value):给pos位置的元素设为value
    • 7.remove(int toRemove):删除第⼀次出现的关键字key
    • 8.size():获取顺序表⻓度
    • 9.clear():清空顺序表
  • 三、总结

一、 定义ArrayList类

arr : 创建一个整型数组,用来存储数据; usedSize : 有效数据,也就是真实的元素个数;
DEFAULT_CAPACITY:默认数组容量
MyArrayList():构造方法,初始化数组长度为默认的容量

public class MyArrayList implements IList{private int[] arr;//存储数据private int usedSize;//有效数据个数public static final int DEFAULT_CAPACITY = 10;//默认数组容量public MyArrayList(){this.arr = new int[DEFAULT_CAPACITY];}

二、常见方法实现

ArrayList的常见方法如下:
在这里插入图片描述

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

 public void add(int data) {//判断顺序表是否满了if (isFull()) {//扩容grow();}//存储this.arr[this.usedSize] = data;this.usedSize++;}public boolean isFull(){return this.usedSize == this.arr.length;}public void grow(){this.arr = Arrays.copyOf(this.arr,2*this.arr.length);}

添加元素时,要先检查数组是否已满(isFull() 通过比较数组的长度和元素个数),如果满了,就要进行扩容grow(),这里是copy两倍的数组容量,然后再进行存储

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

public void add(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++;}private void checkPosAdd(int pos,String msg) {if (pos < 0 || pos > usedSize) {throw new PosIllegalityException(msg);}}

在这里插入图片描述

还是先要检查容量是否已满isFull(),满了就要进行扩容grow(),然后添加时,要先检查pos位置是否合法,如上图,pos < 0 || pos > usedSize就是不合法的,在这个范围则会抛出我们自定义的PosIllegalityException异常,正常情况下进行添加:将pos位置及后面的元素统统向后移动一个位置,为要添加的元素腾出位置,然后有效数据usedSize++

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

public boolean contains(int toFind) {for (int i = 0; i < this.usedSize; i++) {if(arr[i] == toFind){return true;}}return false;}

使用for循环遍历整个数组,if语句判断当前元素是否是你要找的元素toFind,是返回true,不是返回false

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

public int indexOf(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位置的元素

public int get(int pos) {if(isEmpty()){throw new EmptyListException("当前顺序表为空");}checkPos(pos,"get方法的pos位置不合法");return arr[pos];}private void checkPos(int pos,String msg){if (pos<0 || pos >= usedSize){throw new PosIllegalityException(msg);}}public boolean isEmpty(){return usedSize == 0;}

获取元素,先检查pos位置是否为空isEmpty(),如果为空,抛出我们的自定义异常EmptyListException,然后检查pos位置是否合法pos<0 || pos >= usedSize这个范围就是不合法的,抛出我们的自定义异常PosIllegalityException,最后就可以返回pos位置的元素

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

public void set(int pos, int value) {if(isEmpty()){throw new EmptyListException("当前顺序表为空");}checkPos(pos,"set方法执行的时候pos位置不合法"+pos);arr[pos] = value;}

替换时要先检查是否为空isEmpty(),为空抛出自定义异常EmptyListException,不为空检查pos位置是否合法,最后将给定的值替换指定的数组元素

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

public void remove(int toRemove) {if(isEmpty()){throw new EmptyListException("当前顺序表为空");}//查找要删除数据的下标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():获取顺序表⻓度

public int size() {return this.usedSize;}

9.clear():清空顺序表

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

三、总结

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

在这里插入图片描述

http://www.dtcms.com/a/430765.html

相关文章:

  • 安卓基础组件015--textinput
  • YDWE编辑器系列教程三:触发编辑器
  • [hpatch]差分算法学习笔记 -- lite解压
  • 【langgraph】conda创建3.13环境并运行langgraph dev
  • 免费企业建站模板wordpress媒体库一直加载
  • 自己建设公司网站免费建站网站 seo
  • web开发,在线%校园,论坛,社交管理%系统,基于html,css,python,django,mysql
  • 基于开源AI智能名片链动2+1模式S2B2C商城小程序的引流爆款设计策略研究
  • Stable Diffusion里面Cross-Attention设计:为啥Q来自图像/噪声,K和V来自文本
  • 镇江网站关键字优化建立网站站点的过程中正确的是
  • 深度学习第九章 卷积神经网络
  • 【数据结构】堆、计数、桶、基数排序的实现
  • 【数据结构】数据结构秘籍:如何衡量“查找”的快慢?ASL是关键!
  • 1688网站入口学编程的正规学校培训机构
  • Python 2025:嵌入式系统与物联网(IoT)开发新趋势
  • 怎么看网站备案网店运营都要做什么
  • 【数据结构与算法学习笔记】栈
  • Java-Spring入门指南(十八)JSON字符串的解析与对象转换
  • JavaScript 严格模式
  • 数据时代的基石 —— 数据库的核心价值:MySQL 三大范式精讲
  • **跨平台开发:发散创新,探索无界限**随着技术的飞速发展,跨平台开发已经成为软件开发的必然趋势
  • 2025年中小工程企业成本管理新突破:如何选对管理软件?
  • JVM初始堆大小和最大堆大小多少合适?
  • 网站汉英结合的怎么做织梦欧美网站模板
  • 构建AI智能体:五十、ModelScope MCP广场 · MCP协议 · Cherry Studio:AI应用生产线
  • 从零开始:MCP数据库助手(二)- 核心功能实现
  • Django Admin 完全指南:内置功能、高级使用与第三方扩展
  • Django 路由详解
  • Django Admin 配置完全指南:从基础到高级实战
  • MySQL 全量 + 增量备份脚本(RPM 安装)实践与问题解析