Java中ArrayList(顺序表)的自我实现(如果想知道Java中怎么自我实现ArrayList,那么只看这一篇就足够了!)

        前言:在 Java 编程中,ArrayList 是一种非常常用的数据结构,它提供了动态数组的实现方式,可以方便地存储和操作数据。相比于传统的数组,ArrayList 具有更多的灵活性和便利性,可以根据需要动态地调整大小,并提供了一系列丰富的方法来增删改查元素,但是本篇文章主要讲解如何去自我实现Java中ArrayList(顺序表)。


✨✨✨这里是秋刀鱼不做梦的BLOG

✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-CSDN博客

先让我们看一下本文的大致内容:

目录

1.自我定义ArrayList类

2.自我实现ArrayList中的方法

        (1)新增元素,默认在数组最后新增

        (2)在 pos 位置新增元素

        (3)判定是否包含某个元素

        (4)查找某个元素对应的位置

        (5)获取 pos 位置的元素

        (6)给 pos 位置的元素设为 value

        (7)删除第一次出现的关键字key

        (8)获取顺序表长度

        (9)打印顺序表

3.总结自我实现ArrayList


1.自我定义ArrayList类

        在自我实现Java中的ArrayList(顺序表)之前,我们需要先自我定义一个ArrayList类,定义方式如下:

public class MyArrayList{//创建一个数组private int[] array;//用于记录数组中的元素格式private int arrayNumber;//初始化数组原始大小public static final int CAPACITY = 10;//构造方法public MyArrayList() {this.array = new int[CAPACITY];this.arrayNumber = 0;
}

        这段代码定义了一个名为MyArrayList的类,用于实现顺序表。以下是对代码的分析:

  1. 私有属性:

    • array:一个整型数组,用于存储元素。

    • arrayNumber:一个整型变量,用于记录数组中元素的个数。

    • CAPACITY:一个常量,表示数组的初始容量。

  2. 构造方法:

    • MyArrayList():构造方法初始化了数组array为长度为CAPACITY的整型数组,并将arrayNumber初始化为0。

这样我们就定义好了一个ArrayList类,接下来就是实现Java中ArrayList中的方法了。

2.自我实现ArrayList中的方法

        在自我实现ArrayList中的方法之前,先让我们看一下要实现哪些方法:

// 新增元素,默认在数组最后新增
public void add(int data) { }// 在 pos 位置新增元素
public void add(int pos, int data) { }// 判定是否包含某个元素
public boolean contains(int toFind) { }// 查找某个元素对应的位置
public int indexOf(int toFind) { }// 获取 pos 位置的元素
public int get(int pos) { }// 给 pos 位置的元素设为 value
public void set(int pos, int value) { }//删除第一次出现的关键字key
public void remove(int toRemove) { }// 获取顺序表长度
public int size() { }// 打印顺序表
public void display() { }

那么接下来让我们一个一个的自我实现:

        (1)新增元素,默认在数组最后新增

Java代码:

    public boolean isFull() {return this.array.length == this.arrayNumber;}private void beBig() {this.array = Arrays.copyOf(this.array, this.array.length * 2);}public void add(int data) {//判断是否已满if (isFull()) {//顺序表满了就进行扩容beBig();}//顺序表未满,添加元素this.array[this.arrayNumber] = data;this.arrayNumber++;}

  现在我们对这些代码进行分析:

  1. isFull() 方法用于检查顺序表是否已满。它通过比较数组的长度和数组中元素的个数来确定是否满了。如果数组的长度等于数组中元素的个数(即 array.length == arrayNumber),则表示数组已满,返回 true;否则返回 false

  2. beBig() 方法用于扩容数组。它使用 Arrays.copyOf() 方法将原数组扩容为原来的两倍大小。这样做是为了在顺序表满时能够动态扩展数组大小以容纳更多的元素。

  3. add(int data) 方法用于向顺序表中添加元素。首先,它检查顺序表是否已满,如果满了,则调用 beBig() 方法进行扩容。然后,将新元素添加到数组的下一个位置,并更新数组中元素的个数。

        (2)在 pos 位置新增元素

Java代码:

    public boolean isFull() {return this.array.length == this.arrayNumber;}private void beBig() {this.array = Arrays.copyOf(this.array, this.array.length * 2);}public void add(int pos, int data) throws IndexException {//如果索引异常就抛出异常if (pos < 0 || pos > this.arrayNumber) {throw new IndexException("索引异常!!!");} else {//判断是否已满if (isFull()) {对原顺序表进行扩容beBig();} else {for (int i = this.arrayNumber - 1; i >= pos; i--) {this.array[i + 1] = this.array[i];}this.array[pos] = data;this.arrayNumber++;}}}

现在让我们逐行分析一下:

  1. public boolean isFull(): 这个方法检查数组是否已满,即数组中的元素数量是否等于数组的长度。如果是,则返回true,否则返回false。

  2. private void beBig(): 这个方法用于扩大数组的容量。它使用Arrays.copyOf()方法创建了一个新数组,长度是原数组的两倍,然后将原数组的内容复制到新数组中。

  3. public void add(int pos, int data) throws IndexException: 这是一个添加元素的方法,接受两个参数:要添加的位置pos和要添加的数据data。如果位置超出了数组的范围,则抛出IndexException异常。否则,如果数组已满,则先扩大数组的容量,然后执行插入操作;如果数组未满,则将从插入位置开始的元素向后移动一个位置,为新元素腾出位置,并将新元素插入到指定位置。

        (3)判定是否包含某个元素

Java代码:

public boolean contains(int toFind) {//循环遍历顺序表查找目标元素for (int i = 0; i < this.arrayNumber; i++) {if (this.array[i] == toFind) {return true;}}return false;}

现在让我们来逐步分析一下:

  1. 方法签名:public boolean contains(int toFind)

    • 返回类型:boolean,表示是否包含特定元素。

    • 参数:int toFind,表示要查找的元素值。

  2. 循环结构:

    • 使用 for 循环遍历整数数组。

    • 循环变量 i 从 0 开始逐渐增加,直到数组长度(this.arrayNumber)。

  3. 条件判断:

    • 在每次循环中,通过 if 语句检查当前数组元素是否等于要查找的元素 toFind

    • 如果找到了匹配的元素,返回 true,表示数组中包含了要查找的元素。

  4. 返回结果:

    • 如果整个循环执行完毕都没有找到匹配的元素,则返回 false,表示数组不包含要查找的元素。

        (4)查找某个元素对应的位置

Java代码:

public int indexOf(int toFind) {//遍历顺序表查找元素位置for (int i = 0; i < this.arrayNumber; i++) {if (this.array[i] == toFind) {return i;}}return -1;}

让我逐行解释一下:

  1. public int indexOf(int toFind) {: 这是一个公有方法,用于查找数组中某个特定元素的索引。方法的参数 toFind 是要查找的目标元素。

  2. for (int i = 0; i < this.arrayNumber; i++) {: 这是一个 for 循环,从数组的第一个元素开始逐个检查,直到数组的长度为止。this.arrayNumber 可能是数组的长度,尽管代码中未显示出来,但我们可以假设它是这样的。

  3. if (this.array[i] == toFind) {: 在循环的每一次迭代中,检查数组中当前位置的元素是否等于我们要查找的元素 toFind

  4. return i;: 如果找到了匹配的元素,就返回当前元素的索引 i

  5. return -1;: 如果整个数组都被遍历了但没有找到匹配的元素,则返回 -1,表示未找到。

        (5)获取 pos 位置的元素

Java代码:

public boolean isEmpty() {return this.arrayNumber == 0;}public int get(int pos) throws EmptyException, IndexException {//判断数组是否为空if (isEmpty()) {throw new EmptyException("数组为空!!!");}//判断数组索引是否越界if (pos < 0 || pos >= this.arrayNumber) {throw new IndexException("索引异常!!!");}return this.array[pos];}

现在让我逐行解释一下:

  1. isEmpty() 方法用于检查数组是否为空。它通过检查 arrayNumber 属性是否为 0 来判断数组是否为空。如果 arrayNumber 为 0,则返回 true,否则返回 false

  2. get(int pos) 方法用于获取数组中指定位置的元素。它首先调用 isEmpty() 方法来检查数组是否为空。如果数组为空,则抛出 EmptyException 异常,表示数组为空。然后,它检查所请求的位置是否有效,即是否在数组范围内。如果位置 pos 小于 0 或者大于等于 arrayNumber,则抛出 IndexException 异常,表示索引异常。如果以上两个条件都通过了,它返回数组中位置 pos 的元素值。

        (6)给 pos 位置的元素设为 value

Java代码:

public boolean isEmpty() {return this.arrayNumber == 0;}public void set(int pos, int value) throws EmptyException, IndexException {//判断数组是否为空if (isEmpty()) {//抛出异常throw new EmptyException("数组为空!!!");}//判断数组索引是否越界if (pos < 0 || pos >= this.arrayNumber) {//抛出异常throw new IndexException("索引异常!!!");}this.array[pos] = value;}

现在让我逐行解释一下:

  1. isEmpty() 方法用于判断数组是否为空。它返回一个布尔值,表示数组中是否没有元素。具体来说,它通过检查数组中存储的元素数量是否为0来确定数组是否为空。

  2. set(int pos, int value) 方法用于设置数组中指定位置的元素值。它接受两个参数:位置(pos)和要设置的值(value)。在设置之前,它会先检查数组是否为空,如果为空则抛出 EmptyException 异常;然后检查位置是否合法,如果位置越界则抛出 IndexException 异常;最后,如果一切正常,它会将给定的值设置到指定位置的数组元素中。

        (7)删除第一次出现的关键字key

Java代码:

public boolean isEmpty() {return this.arrayNumber == 0;}public void remove(int toRemove) throws EmptyException{//判断数组是否为空if(isEmpty()){//抛出异常throw new EmptyException("数组为空!!!");}//遍历查找目标元素int index = indexOf(toRemove);if(index == -1){return;}for(int i = index;i<this.arrayNumber-1;i++){this.array[i] = this.array[i+1];}this.arrayNumber--;}

现在让我逐行解释一下:

  1. isEmpty() 方法:这个方法用于检查数组是否为空。它通过检查 arrayNumber 是否等于 0 来确定数组是否为空。如果 arrayNumber 为 0,则返回 true,表示数组为空,否则返回 false

  2. remove(int toRemove) 方法:这个方法用于从数组中删除指定的元素 toRemove。首先,它会检查数组是否为空,如果数组为空,则抛出 EmptyException 异常。然后,它会调用 indexOf(toRemove) 方法来查找 toRemove 在数组中的索引位置。如果找不到目标元素,则直接返回,不做任何操作。如果找到了目标元素,则会从该索引位置开始,将后面的元素向前移动一位,覆盖掉要删除的元素。最后,将数组的元素数量 arrayNumber 减一,表示成功删除了一个元素。

        (8)获取顺序表长度

Java代码:

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

这里不做过多的解释了!!!

        (9)打印顺序表

Java代码:

public void display() {//循环遍历输出for (int i = 0; i < this.arrayNumber; i++) {System.out.print(this.array[i] + " ");}}

这里就是最简单的循环遍历数组,将数组中的元素进行输出操作。

        这样我们就完成了顺序表中所有的方法的自我实现了,当然读者还可以自己为这个自我实现的顺序表添加一下方法。

3.总结自我实现ArrayList

        从上边的文章中,我们自我创建了一个ArrayList,并且自我去实现了其中的方法,所以我们对上文进行一些总结,对于自我实现一个类似于ArrayList的数据结构的流程可以概括如下:

  1. 确定数据结构:选择合适的数据结构来存储元素。通常使用数组作为基础数据结构。

  2. 定义类和成员变量:创建一个类来表示 ArrayList,定义数组作为存储元素的数据结构,并定义一个表示数组当前大小的变量。

  3. 实现构造方法:编写构造方法初始化数组和其他必要的变量。

  4. 实现添加元素方法:编写方法来添加新的元素到数组中。需要考虑数组已满时的动态扩容。

  5. 实现获取元素方法:编写方法通过索引获取数组中的元素。

  6. 实现删除元素方法:编写方法来删除指定位置的元素。需要考虑删除元素后,保持数组的连续性。

  7. 实现其他操作方法:根据需要实现其他方法,如获取数组大小、清空数组、判断数组是否为空等。

  8. 异常处理:考虑可能出现的异常情况,如访问空数组、越界访问等,并进行适当的异常处理。

最后,我们附上自我实现的ArrayList的类的完整代码:

public class MyArrayList {private int[] array;private int arrayNumber;public static final int CAPACITY = 10;//构造方法public MyArrayList() {this.array = new int[CAPACITY];this.arrayNumber = 0;}public boolean isFull() {return this.array.length == this.arrayNumber;}private void beBig() {this.array = Arrays.copyOf(this.array, this.array.length * 2);}public void add(int data) {//判断是否已满if (isFull()) {//顺序表满了就进行扩容beBig();}//顺序表未满,添加元素this.array[this.arrayNumber] = data;this.arrayNumber++;}public void display() {for (int i = 0; i < this.arrayNumber; i++) {System.out.print(this.array[i] + " ");}}public void add(int pos, int data) throws IndexException {if (pos < 0 || pos > this.arrayNumber) {throw new IndexException("索引异常!!!");} else {if (isFull()) {beBig();} else {for (int i = this.arrayNumber - 1; i >= pos; i--) {this.array[i + 1] = this.array[i];}this.array[pos] = data;this.arrayNumber++;}}}public boolean contains(int toFind) {for (int i = 0; i < this.arrayNumber; i++) {if (this.array[i] == toFind) {return true;}}return false;}public int indexOf(int toFind) {for (int i = 0; i < this.arrayNumber; i++) {if (this.array[i] == toFind) {return i;}}return -1;}public boolean isEmpty() {return this.arrayNumber == 0;}public int get(int pos) throws EmptyException, IndexException {//判断数组是否为空if (isEmpty()) {throw new EmptyException("数组为空!!!");}//判断数组索引是否越界if (pos < 0 || pos >= this.arrayNumber) {throw new IndexException("索引异常!!!");}return this.array[pos];}public void set(int pos, int value) throws EmptyException, IndexException {//判断数组是否为空if (isEmpty()) {//抛出异常throw new EmptyException("数组为空!!!");}//判断数组索引是否越界if (pos < 0 || pos >= this.arrayNumber) {//抛出异常throw new IndexException("索引异常!!!");}this.array[pos] = value;}public void remove(int toRemove) throws EmptyException {//判断数组是否为空if (isEmpty()) {//抛出异常throw new EmptyException("数组为空!!!");}//遍历查找目标元素int index = indexOf(toRemove);if (index == -1) {return;}for (int i = index; i < this.arrayNumber - 1; i++) {this.array[i] = this.array[i + 1];}this.arrayNumber--;}public int size() {return this.arrayNumber;}}

关于Java中顺序表的使用------------------------------------------------------------------------------------>Java数据结构之ArrayList(如果想知道Java中有关ArrayList的知识点,那么只看这一篇就足够了!)-CSDN博客


以上就是本片文章的全部内容了~~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/350555.html

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

相关文章

温泉镇旅游微信小程序的设计与实现(论文+源码)_kaic

摘要 旅游业随着经济的快速发展呈现出一派欣欣向荣的景象&#xff0c;尤其是近两年来&#xff0c;各个行业运用科技以及因特网来促进旅游迅速发展&#xff0c;逐渐都显示出了的问题&#xff0c;特别突出的是在线上推广&#xff0c;其缺点也是特别明显。尽管在新冠肺炎的冲击下&…

后端中缓存的作用以及基于Spring框架演示实现缓存

缓存的作用及演示 现在我们使用的程序都是通过去数据库里拿数据然后展示的 长期对数据库进行数据访问 这样数据库的压力会越来越大 数据库扛不住了 创建了一个新的区域 程序访问去缓存 缓存区数据库 缓存里放数据 有效降低数据访问的压力 我们首先进行一个演示 为了演示…

基于System-Verilog的FPGA设计与仿真

一、System-Verilog System Verilog的发展 SystemVerilog 的出现是为了因应日益复杂的数位电路设计和验证需求。虽然Verilog HDL 在早期的数位电路设计中得到了广泛应用&#xff0c;但随着技术的发展和电路复杂度的增加&#xff0c;Verilog HDL 在某些方面已经显得有些不足以满…

甘肃这款饼子很火 你是否有吃过呢

白吉饼那独特的外形&#xff0c;圆圆的十分可爱。&#x1f44f;它的表皮酥脆&#xff0c;内里绵软&#xff0c;麦香四溢。&#x1f60b;拿在手里沉甸甸的&#xff0c;就知道用料十足。 无论是直接吃&#xff0c;感受那纯粹的面香&#xff0c;还是夹上腊汁肉&#xff0c;变成美味…

智慧监狱技术解决方案

1. **建设背景**&#xff1a;介绍了智慧监狱建设的战略部署&#xff0c;包括司法部提出的“数字法治、智慧司法”信息化体系建设&#xff0c;以及智慧监狱建设的总体目标、重点任务和实施步骤。 2. **建设需求**&#xff1a;分析了当前监狱系统存在的问题&#xff0c;如子系统…

Python 小市值股票模型代码及回测分析

目录 一、模型介绍 二、代码详解 2.1 初始化函数 2.2 股票筛选过滤函数 2.3 止损函数 2.4 开盘时运行函数 2.5 调仓函数 三、回测结果分析 3.1 收益净值图与概述 3.2 模型收益概览 3.3 年度收益图 3.4 月度收益的时间序列 3.5 月度收益热力图 3.6 月度收益频次分…

手机上安装AI模型是一种什么体验?

昨天参加微软的AI DAY活动&#xff0c;看到微软的技术大佬分享了一个场景&#xff0c;就是坐飞机从上海到北京&#xff0c;机长广播因为天气原因&#xff0c;飞机需要盲降&#xff0c;他说当时听到盲降第一反应感觉有点恐慌&#xff0c;但是因为飞机上受限于网络环境&#xff0…

玄机平台应急响应—MySQL应急

前言 这个是比较简单的&#xff0c;其实和MySQL没啥太大的关系&#xff0c;没涉及太多MySQL的知识。看一下它的flag要求吧。 flag1 它说黑客写入的shell&#xff0c;那我们就去它的网站目录去看看&#xff0c;果然有一个叫sh.php的文件。 flag1{ccfda79e-7aa1-4275-bc26-a61…

C++ 18 之 函数的重载

c18函数的重载.cpp #include <iostream> #include <string.h> using namespace std;void fun4(int a) {cout << "int a: "<< a << endl; } void fun4(double a) {cout << "double a: " << a << endl; }v…

图书管理系统(SpringBoot+SpringMVC+MyBatis)

目录 1.数据库表设计 2.引入MyBatis和MySQL驱动依赖 3.配置数据库&日志 4.Model创建 5.用户登录功能实现 6.实现添加图书功能 7.实现翻页功能 1.数据库表设计 数据库表是应⽤程序开发中的⼀个重要环节, 数据库表的设计往往会决定我们的应⽤需求是否能顺利实现, 甚至决…

挑战5分钟内基于Springboot+SpringMVC+Mybatis-plus快速构建web后端三层架构

目标 在清晨的代码编辑器上&#xff0c;一场新的挑战即将开始。程序员们肃立于安静的办公室&#xff0c;眼神专注地盯着屏幕&#xff0c;等待着编译器的一声提示。 随着编译器输出的激动人心的"start!"的提示&#xff0c;战斗的序幕拉开了。Bug如潮水般涌来&#x…

SAP Build 2-PDF数据提取与决策

0. 安装desktop agent 在后续过程中发现要预先安装desktop agent&#xff0c;否则没法运行自动化流程… 0.1 agent下载 参考官方文档说明 https://help.sap.com/docs/build-process-automation/sap-build-process-automation/create-user-in-rbsc-download-repository?loca…

什么是无头浏览器以及其工作原理?

如果您对这个概念还不熟悉&#xff0c;那么使用无头网络浏览器的想法可能会让您感到不知所措。无头浏览器本质上与您熟悉的网络浏览器相同&#xff0c;但有一个关键区别&#xff1a;它们没有图形用户界面 (GUI)。这意味着没有按钮、选项卡、地址栏或视觉显示。 相反&#xff0c…

极致深耕,打造核心竞争壁垒——探寻蓝思科技穿越周期的密码

作者 | 曾响铃 文 | 响铃说 一家企业&#xff0c;如何才能在时代变幻的风云中不计较一时得失&#xff0c;长期稳健发展&#xff0c;穿越周期&#xff1f;本期主题就来探寻一家在湖南的国际化企业的发展密码。 穿越周期的企业&#xff0c;都在坚持一个驱动发展的“原点” 细…

Python虚拟环境的配置

前言&#xff1a; 本人一度被Python的虚拟环境的配置所困扰&#xff0c;前段时间抽空学习了一下&#xff0c;现在总结一下方法&#xff0c;供大家参考。 先使用winr打开命令行窗口。 展示所有虚拟环境 conda env list 创建虚拟环境 例如我们创建一个叫做py_sk的虚拟环境 …

Windows下的zip压缩包版Mysql8.3.0数据迁移到Mysql8.4.0可以用拷贝data文件夹的方式

Windows下的zip压缩包版Mysql8.3.0数据迁移到Mysql8.4.0可以用拷贝data文件夹的方式 拷贝后, 所有账户和数据都是一样的 步骤 停止MySQL服务 net stop mysql 或 sc.exe stop mysql net stop mysqlsc.exe stop mysql卸载 Mysql8.3.0 的服务 mysqld remove 或 mysqld remove m…

工资信息管理系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;基础数据管理&#xff0c;公告管理&#xff0c;津贴管理&#xff0c;管理员管理&#xff0c;绩效管理 用户账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;公告管理&#xff0c;津…

MEMS:Lecture 17 Noise MDS

讲义 Minimum Detectable Signal (MDS) Minimum Detectable Signal&#xff08;最小可检测信号&#xff09;是指当信号-噪声比&#xff08;Signal-to-Noise Ratio, SNR&#xff09;等于1时的输入信号水平。简单来说&#xff0c;MDS 是一个系统能够分辨出信号存在的最低输入信号…

Opencv基本操作

Opencv基本操作 导入并使用opencv进行图像与视频的基本处理 opencv读取的格式是BGR import cv2 #opencv读取的格式是BGR import numpy import matplotlib.pyplot as plt %matplotlib inline图像读取 通过cv2.imread()来加载指定位置的图像信息。 img cv2.imread(./res/ca…

HAL库开发--串口

知不足而奋进 望远山而前行 目录 文章目录 前言 学习目标 学习内容 开发流程 串口功能配置 串口功能开启 串口中断配置 串口参数配置 查询配置结果 发送功能测试 中断接收功能测试 printf配置 DMA收发 配置 DMA发送 DMA接收(方式1) DMA接收(方式2) 总结 前言…