手敲myarraylist,深入了解其运行逻辑

1、自定义MyArrayList类

        该类里面基本有两个属性,一个是用来存放数据的数组,另外一个是用来描述已经存放数据的数量。同时设置arraylist表的默认长度为10;代码如下:

public class MyArrayList {private int[] elem;private int usedSize;//表示表的实际占用空间//顺序表的默认大小public static final int DEFAULT_SIZE = 10;public MyArrayList(int[] elem) {elem = new  int[DEFAULT_SIZE];}
}

2. 创建接口

        我们创建一个接口,要将arraylist要实现的抽象方法列出来,使得后期直接在自定义类里面能够具体化;

public interface IList {//新增元素,默认在数组最后新增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);//删除第一次出现的关键字keypublic void remove(int toRemove) ;// 获取顺序表长度public int size();// 清空顺序表public void clear() ;// 打印顺序表,注意:该方法并不是顺序表中的方法,为了方便看测试结果给出的public void display();boolean isFull();public boolean isEmpty();
}

0594d631c9c64646954505e845c8119c.png

        同时我们的自定义类实现该接口,并实现接口中的方法;我们接下来通过自己手敲arraylist的一些方法来从底层深入的学习arraylist表如何完成一系列的方法实现,方便我们了解arraylist表的运行逻辑和优缺点;

3、实现具体方法

3.1 打印顺序表

        只要知道当前类对象的实际长度即可完成打印顺序表操作;

 @Overridepublic void display() {for (int i = 0; i <= this.usedSize-1; i++) {System.out.print(this.elem[i]+"->");}System.out.println();}

3.2新增元素 

        我们此处的方法默认添加的每一个元素是从底层数组末尾依次添加的

        思路:

        1、 首先需要确定当前存储在数组中最后一位数据的索引(即usedSize-1),然后下一个存储空间范围合法的话,直接将我们要添加的数据放到接下来的数组索引上即可(数据存放的索引应该为usedSized)

        1.1 这时候就要考虑如果我们要存放数据之前要判断数组的空间是否满了(我们之前默认存储容量为10);

        1.2 如果判断出数组当前已满,我们就要对数组存空容量进行扩容;

        2、添加完成后,usedSize往后移一位;

7465cf75839643acbc1888171cc5a1c5.png

        代码如下 

@Overridepublic void add(int data) {checkCapacity();//此时表示空间足够,可以存放数据this.elem[this.usedSize] = data;this.usedSize++;}private void checkCapacity() {if (isFull()){//如果当前的数组已经满了,我们就要扩容elem = Arrays.copyOf(elem,elem.length*2);}}@Overridepublic boolean isFull() {return usedSize == elem.length;}

        测试及结果:

public static void main(String[] args) {MyArrayList myArrayList = new MyArrayList();myArrayList.add(2023);myArrayList.add(11);myArrayList.add(29);myArrayList.display();}

1fd0a62fd02845bab7343a880cb9fb31.png

3.3 在 pos 位置新增元素 

        思路:在pos下标添加data;

        1、应该把pos下标到usedSzie-1下标之间的元素往右面移动(包含pos),且得先从最右边的元素开始移动

        1、1必须保证pos下标位置在0~usedSize范围之间;(即一个顺序表只有0下标有位置,想要往3下标位置插入数据是不科学的)

        1.2 如果要在usedSize-1的位置插入数据,我们要进行扩容操作;

        2、最后userSize++;

        详细图解如下图所示:

c844f578a866406292dab11fde630f15.png

        代码如下所示:

public class PosIllegality extends RuntimeException{public PosIllegality(String msg){super(msg);}
}@Overridepublic void add(int pos, int data) {try {checkPosOnAdd(pos);}catch (PosIllegality e) {e.printStackTrace();return;}//必须保证pos下标位置在0~usedSize范围之间,所以要检查checkCapacity();//1、从最后一个有效的数据开始往后移动// 2、当i < pos 就结束for (int i = usedSize-1; i >= pos; i--) {//下标为pos的也得搬家elem[i+1] = elem[i];}//3、存放元素到pos 位置elem[pos] = data;//4、usedSize++;usedSize++;}checkCapacity();//1、从最后一个有效的数据开始往后移动 //2、当i < pos 就结束for (int i = usedSize-1; i >= pos; i--) {elem[i+1] = elem[i];}//3、存放元素到pos 位置elem[pos] = data;//4、usedSize++;usedSize++;}

        执行结果:

        eg1:

public static void main(String[] args) {MyArrayList myArrayList = new MyArrayList();myArrayList.add(2023);myArrayList.add(11);myArrayList.add(29);myArrayList.add(4,99);myArrayList.display();}

1263c13a2de348febc0c2c1ec1093880.png

        eg2:

public static void main(String[] args) {MyArrayList myArrayList = new MyArrayList();myArrayList.add(2023);myArrayList.add(11);myArrayList.add(29);myArrayList.add(2,29);myArrayList.display();}

aa13e3e5a5e8420d99b713d8a34119e1.png

3.4判定是否包含某个元素

        思路:先遍历整个数组,再判断是否包含;

        注意:首先要判断列表是否为空

        此处代码图解:

87077505fd8c48e28113f60bf3f86e84.png

 @Overridepublic boolean contains(int toFind) {if(isEmpty()) {return false;}for (int i = 0; i < usedSize; i++) {//如果是查找引用数据类型 一定记住 重写方法if(elem[i] == toFind) {return true;}}return false;}@Overridepublic boolean isEmpty() {return usedSize == 0;}

3.5 查找某个元素对应的位置 

        找到列表中的钙元素,返回其在列表中的索引

        思路:

        1、如果列表为空,则返回-1;

        2、遍历数组,找到返回索引,找不到返回-1;

        下图为方法代码和运行结果

 @Overridepublic int indexOf(int toFind) {if (isEmpty()){return -1;}for (int i = 0; i < usedSize; i++) {if (elem[i] == toFind){return i;}}return -1;}public static void main(String[] args) {MyArrayList myArrayList = new MyArrayList();myArrayList.add(2023);myArrayList.add(11);myArrayList.add(29);myArrayList.add(2,29);myArrayList.display();System.out.println(myArrayList.indexOf(2023));System.out.println(myArrayList.indexOf(2024));}

4d77f1b410e441ecad471c560691e604.png

3.6 获取 pos 位置的元素

        思路:

        1、检查pos是否合法,当pos不合法时,抛出异常,停止下面的代码运行;

        2、检查书序表是否为空,如果链表为空,抛出异常,停止下面的代码运行;

        3、除此外,返回pos 位置的元素

        下图为代码逻辑图:

9b14bb7d431a4b9cad28a2a993bfb945.png

        具体方法如下:

public class MyArrayListEmpty extends RuntimeException{public MyArrayListEmpty(String msg){super(msg);}
}@Overridepublic int get(int pos) {checkPosOnGetAndSet(pos);if (isEmpty()){throw new MyArrayListEmpty("获取指定下标元素时" +"顺序表为空!");}return elem[pos];}
private void checkPosOnGetAndSet(int pos) {if (pos < 0 || pos > usedSize){System.out.println("这个pos不符合法!");throw new PosIllegality("查找pos下标元素时发现pos异常: "+pos);}}

        执行代码及结果:

 public static void main(String[] args) {MyArrayList myArrayList = new MyArrayList();myArrayList.add(2023);myArrayList.add(11);myArrayList.add(29);myArrayList.add(2,29);myArrayList.display();System.out.println(myArrayList.get(1));System.out.println(myArrayList.get(6));}

ebc497c0932547a7afd012b12dc0f291.png3.7 给 pos 位置的元素设为 value 

        代码如下:

 @Overridepublic void set(int pos, int value) {checkPosOnGetAndSet(pos);elem[pos] = value;}
public static void main(String[] args) {MyArrayList myArrayList = new MyArrayList();myArrayList.add(2023);myArrayList.add(11);myArrayList.add(29);myArrayList.add(2,29);myArrayList.display();myArrayList.set(1,2029);myArrayList.display();}

        运行结果如图所示: 

d30410b7a19248cfb4a2a193d59a971d.png

3.8 删除第一次出现的关键字key 

        思路:

         1、先通过查找索引的方法,寻找key在列表中的索引。如果没有找到,停止运行

        2、如果找到,开始删除该元素,自这个元素以后得所有元素往前移一个单位

        3、删除成功后,usedSize--                 

@Overridepublic void remove(int toRemove) {int index = indexOf(toRemove);if(index == -1) {System.out.println("没有这个数字!");return;}for(int i = index; i < usedSize-1;i++) {elem[i] = elem[i+1];}usedSize--;}

3.9 获取顺序表长度 

@Overridepublic int size() {return this.usedSize;}

3.10 清空顺序表 

 @Overridepublic void clear() {this.usedSize = 0;}

ps:本次内容就到这里结束了,喜欢的话,还请大家一键三连哦!!! 

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

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

相关文章

自学成为android framework工程师需要准备哪些装备-千里马车载车机系统开发学习

背景 hi&#xff0c;粉丝朋友们&#xff1a; 大家好&#xff01;经常有很多学员买课同学都会问到需要准备哪些装备&#xff0c;我也回答了很多学员了&#xff0c;今天就搞一篇文章来统一说明一下&#xff0c;告诉一下大家如果你想从一个framework新手变成一个framework开发的高…

Element-Plus 图标自动导入

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall &#x1f343; vue3-element-admin &#x1f343; youlai-boot &#x1f33a; 仓库主页&#xff1a; Gitee &#x1f4ab; Github &#x1f4ab; GitCode &#x1f496; 欢迎点赞…

机器学习——决策树

1.决策树 2.熵&#xff08;不确定程度&#xff09; 3.信息增益 & 信息增益比 3.1 信息增益 & 信息增益比 的 概念 3.2 案例解释说明 &#xff13;.&#xff12;.&#xff11;数据集说明 &#xff13;.&#xff12;.&#xff12;计算 &#xff14;&#xff0e;&#x…

为工业企业介绍新版 PT ISIM

&#x1f3ed; 我们发布了新版 PT Industrial Security Incident Manager - 4.4&#xff0c;这是一款深度流程流量分析系统。 以下是主要变化的简要概述 &#x1f5a5; 新增 microView Sensor 它安装在紧凑型工业 PC 上&#xff0c;设计用于小型自动化设施&#xff1a;6-10 …

Java实现简单的王者荣耀游戏

一、创建新项目 首先创建一个新的项目&#xff0c;并命名为wangzherongyao。 其次在飞翔的鸟项目下创建一个名为img的文件夹用来存放游戏相关图片。详细如下图&#xff1a; 二、游戏代码 1、创建怪物类 1.bear&#xff1a; package beast;import wangzherogyao.GameFrame;…

Linux 基本语句_13_消息队列

概念&#xff1a; 不同进程能通过消息队列来进行通信&#xff0c;不同进程也能获取或发送特定类型的消息&#xff0c;即选择性的收发消息。 一般一个程序采取子进程发消息&#xff0c;父进程收消息的模式 常用函数功能&#xff1a; fork(); // 创建子进程 struct msgbuf{ …

运维知识点-openResty

openResty 企业级实战——畅购商城SpringCloud-网站首页高可用解决方案-openRestynginxlua——实现广告缓存测试企业级实战——畅购商城SpringCloud-网站首页高可用解决方案-openRestynginxlua——OpenResty 企业级实战——畅购商城SpringCloud-网站首页高可用解决方案-openRes…

2023-简单点-树莓派-camera module 3介绍

Raspberry Pi Camera Module 3 介绍开头先说&#xff0c;注意事项libcamera感光芯片和驱动的兼容图额外&#xff1a;不同module的对应的参数图用bullseye系统测试摄像头预览窗口拍摄静态图片bayer raw图像获取超长曝光视频流raw视频流 ref 介绍 树莓派镜像在Bullseye版本之后&…

linux 讨论题合集(个人复习)

常规文件的权限是什么&#xff1f;如何分配或修改这些权限&#xff1f;文件夹&#xff08;目录&#xff09;的权限是什么&#xff1f;显示常规文件和文件夹的区别 讨论&#xff1a;①常规的文件权限有四种&#xff0c;r可读、w可写、x可执行、-没有权限&#xff1b;②可以使用c…

如何使用录屏软件在电脑录制PDF文件

我有一个PDF文件&#xff0c;想用录屏软件将它录制下来并添加上详细的注释&#xff0c;然后发给客户看&#xff0c;请问应该如何录制呢&#xff1f;有没有推荐的录屏软件呢&#xff1f; 不用担心&#xff0c;本文将会详细的为您讲解如何使用录屏软件在电脑端录制PDF文件&#…

软件测试jmeter基本使用

1安装与配置 1.jdk下载 下载地址&#xff1a;https://www.oracle.com/java/technologies/downloads/#jdk18-windows&#xff08;压缩包中会给&#xff09; 2.jmeter下载 Apache JMeter - Download Apache JMeter&#xff08;压缩包中有&#xff09; 3.操作教学 打开软件后新…

【MySQL数据库】SQL查询语句总结

目录 一、查询数据 1.1 基本查询语句 1.2 表单查询 1.3 WHERE子句 1.3.1 IN关键字查询 1.3.2 Between查询范围 1.3.3 Like匹配查询 1.3.4 AND多条件查询&#xff08;等同于&&&#xff09; 1.3.5 OR多条件查询&#xff08;等同于||&#xff09; 1.3.6 LIMIT子句 1.3.7 对…

【Node.js】笔记整理4 - 版本管理工具nvm

写在最前&#xff1a;跟着视频学习只是为了在新手期快速入门。想要学习全面、进阶的知识&#xff0c;需要格外注重实战和官方技术文档&#xff0c;文档建议作为手册使用 系列文章 【Node.js】笔记整理 1 - 基础知识【Node.js】笔记整理 2 - 常用模块【Node.js】笔记整理 3 - n…

【docker】docker安装与优化

目录 一、安装Docker 1、关闭防火墙 2、安装依赖包 3、设置阿里云镜像源 4、安装Docker-CE社区版并设置为开机自启动 5、查看Docker信息 二、设置镜像加速 1、申请加速地址 2、实现加速操作 三、网络优化 1、如何网络优化 2、具体操作 四、docker-server端配置文件…

前端:实现二级菜单(点击实现二级菜单展开)

效果 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-width, i…

【Excel】WPS快速按行筛选过滤

用的筛选都是进行列数据过滤&#xff0c;那么遇到一个情况需要行数据过滤查看数据 行过滤 选中行&#xff0c;然后右键菜单&#xff0c;行筛选。 列过滤

7Docker搭建es和kibana

一、安装es 1.拉取镜像 sudo docker pull elasticsearch:7.12.0 elasticsearch:7.12.0:我安装的版本是7.12.0&#xff0c;可以根据实际的情况安装 创建docker容器挂在的目录&#xff1a; sudo mkdir -p /opt/elasticsearch/config sudo mkdir -p /opt/elasticsearch/data s…

使用Python爬取快手视频与评论(App与Web端分析)

文章目录 1. APP端抓包配置2. APP端抓包分析3. Web端抓包分析4. 爬虫代码实现 【作者主页】&#xff1a;吴秋霖 【作者介绍】&#xff1a;Python领域优质创作者、阿里云博客专家、华为云享专家。长期致力于Python与爬虫领域研究与开发工作&#xff01; 【作者推荐】&#xff1a…

13:kotlin类和对象 -- 属性(Properties)

定义属性 类属性可使用var和val定义 class Address {var name: String "Holmes, Sherlock"var street: String "Baker"var city: String "London"var state: String? nullvar zip: String "123456" }属性使用 fun copyAddres…

【虚拟机】Docker基础 【一】

1.1.部署MySQL 首先&#xff0c;我们利用Docker来安装一个MySQL软件&#xff0c;大家可以对比一下之前传统的安装方式&#xff0c;看看哪个效率更高一些。 如果是利用传统方式部署MySQL&#xff0c;大概的步骤有&#xff1a; 搜索并下载MySQL安装包上传至Linux环境编译和配置…