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.mzph.cn/diannao/27963.shtml

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

相关文章

axios打通fastapi和vue,实现前后端分类项目开发

axios axios是一个前后端交互的工具&#xff0c;负责在前端代码&#xff0c;调用后端接口&#xff0c;将后端的数据请求到本地以后进行解析&#xff0c;然后传递给前端进行处理。 比如&#xff0c;我们用fastapi写了一个接口&#xff0c;这个接口返回了一条信息&#xff1a; …

后端项目怎么做?怎么准备面试,看这篇就够了!

近期群友都在海投&#xff0c;广撒网&#xff0c;为的就是等一个面试机会&#xff0c;等一个offer。 当收到面试通知的时候&#xff0c;大家一定要好好把握机会。 机会很重要&#xff0c;给你机会&#xff0c;没有把握住&#xff0c;那就比较尴尬了。 对于研发岗位来说&…

Hadoop 2.0:主流开源云架构(三)

目录 四、Hadoop 2.0体系架构&#xff08;一&#xff09;Hadoop 2.0公共组件Common&#xff08;二&#xff09;分布式文件系统HDFS&#xff08;三&#xff09;分布式操作系统Yarn&#xff08;四&#xff09;Hadoop 2.0安全机制简介 四、Hadoop 2.0体系架构 &#xff08;一&…

如何解决mfc100u.dll丢失问题,关于mfc100u.dll丢失的多种解决方法

在计算机使用过程中&#xff0c;我们常常会遇到一些错误提示&#xff0c;其中之一就是“计算显示缺失mfc100u.dll”。这个问题可能会影响到我们的正常使用&#xff0c;因此了解它的原因、表现以及解决方法是非常重要的。小编将详细介绍计算显示缺失mfc100u.dll的问题&#xff0…

音视频集式流媒体边缘分布式集群拉流管理

一直以来&#xff0c;由于srs zlm等开源软件采用传统直播协议&#xff0c;即使后面实现了webrtc转发&#xff0c;由于信令交互较弱&#xff0c;使得传统的安防监控方案需要在公网云平台上部署大型流媒体服务器&#xff0c;而且节点资源不能统一管理调度&#xff0c;缺乏灵活性和…

基于PPO的强化学习超级马里奥自动通关

目录 一、环境准备 二、训练思路 1.训练初期&#xff1a; 2.思路整理及改进&#xff1a; 思路一&#xff1a; 思路二&#xff1a; 思路三&#xff1a; 思路四&#xff1a; 3.训练效果&#xff1a; 三、结果分析 四、完整代码 训练代码&#xff1a; 测试代码&#x…

2024.ZCPC.M题 计算三角形个数

题目描述&#xff1a; 小蔡有一张三角形的格子纸&#xff0c;上面有一个大三角形。这个边长为 的大三角形&#xff0c; 被分成 个边长为 1 的小三角形(如图一所示)。现在&#xff0c;小蔡选择了一条水平边 删除&#xff08;如图二所示&#xff09;&#xff0c;请你找出图上剩余…

RestTemplate远程请求的艺术

1 简说 编程是一门艺术,追求优雅的代码就像追求优美的音乐。 很多有多年工作经验的开发者,在使用RestTemplate之前常常使用HttpClient,然而接触了RestTemplate之后,却愿意放弃多年相处的“老朋友”,转向RestTemplate。那么一定是RestTemplate有它的魅力,有它的艺术风范。…

【ARM-Linux篇】阿里云人脸识别方案

一、接入阿里云 https://vision.aliyun.com/ 点击“人脸搜索1:N” 点击"立即开通"&#xff1a; 使用阿里云APP/支付宝/钉钉扫码登录&#xff1a; 购买“人脸搜索1:N”能力&#xff0c;第一次购买&#xff0c;可以有5000次的免费使用&#xff1a; 开通完后&#xff…

【踩坑日记】I.MX6ULL裸机启动时由于编译的程序链接地址不对造成的程序没正确运行

1 现象 程序完全正确&#xff0c;但是由于程序链接的位置不对&#xff0c;导致程序没有正常运行。 2 寻找原因 对生成的bin文件进行反汇编&#xff1a; arm-linux-gnueabihf-objdump -D -m arm ledc.elf > ledc.dis查看生成的反汇编文件 发现在在链接的开始地址处&…

Ubuntu基础-VirtualBox安装增强功能

目录 零. 前言 一. 安装 1.点击安装增强功能 2.点击光盘图标 3.复制到新文件夹 4.运行命令 5.重启系统 6.成果展示 二. 打开共享 1.共享粘贴 ​编辑2.共享文件夹 三.总结 安装步骤 打开共享粘贴功能&#xff1a; 打开共享文件夹功能&#xff1a; 零. 前言 在使用…

redis未授权访问

redis数据库基本知识 redis非关系型数据库 redis未授权访问蓝队的成因和危害 漏洞的定义&#xff1a;redis未授权访问漏洞是一个由于redis服务器版本较低&#xff0c;其未设置登录密码导致的登录。 攻击者可以直接利用redis服务器的ip地址和端口完成redis服务器的远程登陆&…

为什么笔记本电脑触控板不工作?这里有你想要的答案和解决办法

序言 你的笔记本电脑触控板停止工作了吗?值得庆幸的是,这个令人沮丧的问题通常很容易解决。以下是笔记本电脑触控板问题的最常见原因和修复方法。 触控板被功能键禁用 大多数(如果不是全部的话)Windows笔记本电脑都将其中一个功能键用于禁用和启用笔记本电脑触控板。按键…

民生银行信用卡中心金融科技24届春招面经

本文介绍2024届春招中&#xff0c;中国民生银行下属信用卡中心的金融科技&#xff08;系统研发方向&#xff09; 岗位2场面试的基本情况、提问问题等。 2024年04月投递了中国民生银行下属信用卡中心的金融科技&#xff08;系统研发方向&#xff09; 岗位&#xff0c;暂时不清楚…

关于反弹shell的学习

今天学习反弹shell&#xff0c;在最近做的ctf题里面越来越多的反弹shell的操作&#xff0c;所以觉得要好好研究一下&#xff0c;毕竟是一种比较常用的操作 什么是反弹shell以及原理 反弹Shell&#xff08;也称为反向Shell&#xff09;是一种技术&#xff0c;通常用于远程访问和…

C++设计模式——Decorator装饰器模式

一&#xff0c;装饰器模式简介 装饰器模式是一种结构型设计模式&#xff0c; 它允许在不改变现有对象的情况下&#xff0c;动态地将功能添加到对象中。 装饰器模式是通过创建具有新行为的对象来实现的&#xff0c;这些对象将原始对象进行了包装。 装饰器模式遵循开放/关闭原…

element-plus 的el-scrollbar滚动条组件

el-scrollbar组件可以替换原生的滚动条&#xff0c;可以设置出现滚动条的高度&#xff0c;若无设置则根据容器自适应。 通过使用 setScrollTop 与 setScrollLeft 方法&#xff0c;可以手动控制滚动条滚动。 scroll 滚动条的滚动事件&#xff0c;会返回滚动条当前的位置。 &l…

snap nextcloud 通过不被信任的域名访问

安装向导 — Nextcloud latest 管理手册 latest 文档 find / -name config.php trusted_domains >array (0 > localhost,1 > server1.example.com,2 > 192.168.1.50,3 > [fe80::1:50], ), vim /var/snap/nextcloud/42567/nextcloud/config/config.php vim /va…

pytorch--Pooling layers

文章目录 1.torch.nn.MaxPool1d()2.torch.nn.MaxPool2d3.torch.nn.AvgPool2d()4.torch.nn.FractionalMaxPool2d()5.torch.nn.AdaptiveMaxPool2d()6.torch.nn.AdaptiveAvgPool2d() 1.torch.nn.MaxPool1d() torch.nn.MaxPool1d() 是 PyTorch 库中的一个类&#xff0c;用于在神经网…

ISP图像算法面试准备(1)

ISP图像算法面试准备 ISP图像算法面试准备(1) 文章目录 ISP图像算法面试准备前言一、ISP流程二、重点关注1. AWB必须在Demosaic之后进行。2. Gamma矫正通常在CCM之前进行 三、如何实现ISP参数自动化调试四、AE&#xff0c;即自动曝光&#xff08;Auto Exposure&#xff09;总结…