手敲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.mzph.cn/news/184121.shtml

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

相关文章

kubernetes七层负载Ingress搭建(K8S1.23.5)

首先附上K8S版本及Ingress版本对照 Ingress介绍 NotePort&#xff1a;该方式的缺点是会占用很多集群机器的端口&#xff0c;当集群服务变多时&#xff0c;这个缺点就愈发的明显(srevice变多&#xff0c;需要的端口就需要多) LoadBalancer&#xff1a;该方式的缺点是每个servi…

Retrofit中的注解

一、Retrofit中的注解有那些&#xff1f; 方法注解&#xff1a;GET ,POST,PUT,DELETE,PATH,HEAD,OPTIONS,HTTP标记注解&#xff1a;FormUrlEncoded&#xff0c;Multpart&#xff0c;Streaming参数注解&#xff1a;Query&#xff0c;QueryMap&#xff0c;Body&#xff0c;Field…

JSP+servlet实现高校社团管理系统

JSPservlet实现的高校社团管理系统 &#xff0c;前后台都有&#xff0c;前台演示地址:高校社团管理系统 后台演示地址:登录 用户名:sys,密码:123456 前台功能&#xff1a;首页&#xff0c;社团列表&#xff0c;社团风采&#xff0c;社团活动&#xff0c;新闻列表&#xff0c…

阿里云新版公共实例从注册账号到创建设备生成参数教程

1 注册阿里云 打开阿里云官网&#xff0c;点击右上角的登录/注册 打开的界面按照图片输入手机号注册 注册成功后&#xff0c;登录返回第一次打开的界面&#xff0c;点击控制台 点击控制台后界面如下 点击左上角的菜单&#xff0c;弹出新窗口&#xff0c;搜索物联网平台 开通物…

springmvc(基础学习整合)

SpringMVC是Spring框架提供的构建Web应用程序的全功能MVC模块。 在SpringMVC的各个组件中&#xff0c;处理器映射器、处理器适配器、视图解析器称为SpringMVC的三大组件。 springMVC基本介绍&#xff1a; http://t.csdnimg.cn/TOzw9 MVC是一种设计思想&#xff0c;将一个应…

华为云cce容器管理中的调度策略作用

研究不深&#xff0c;但是这个还是挺重要的&#xff0c;在这里记录一下。 在cce节点集群中&#xff0c;有时候会发现有的节点实例过于饱满&#xff0c;有的又有些空&#xff0c;导致部分节点由于压力过大&#xff0c;存在崩溃的危险&#xff0c;这时候调度策略就有用了。 我这…

图扑参展高交会-全球清洁能源创新博览会

“相聚鹏城深圳&#xff0c;共享能源盛宴” 第二十五届中国国际高新技术成果交易会(简称“高交会”)于 11 月 15-18 日在深圳盛大开幕。高交会由商务部、科学技术部、工业和信息化部、国家发展改革委、农业农村部、国家知识产权局、中国科学院、中国工程院和深圳市人民政府共同…

nvm for windows使用与node/npm/yarn的配置

1 下载 nvm for windows download – github 下拉到Assets, 下载.exe文件 2 安装 安装到如下文件夹中 目录可以自己选, 可以换别的名字, 自己记住即可 新手建议全部看完再进行个人配置, 或者使用与博主一致的路径 D:\DevelopEnvironment\nvm3 配置nvm使用的镜像 node_mir…

Carbonyl ,一个可以在终端里运行的浏览器

浏览器对于我们的日常来说是使用频率比较高的一个东西。 一般来说&#xff0c;对于桌面的发行版的linux的浏览器&#xff0c;用的比较多的是Firefox浏览器。对于我们日常windows、mac等。常用的有chrome、edge等。 但是&#xff01;在终端里运行一个浏览器&#xff0c;我想大多…

SaaS模式C/S检验科LIS系统源码

适用于医院检验科实际需要的管理系统, 实现检验业务全流程的计算机管理。从检验申请、标本编号、联机采集、中文报告单的生成与打印、质控图的绘制和数据的检索与备份。通过将所有仪器自身提供的端口与科室LIS系统中的工作站点连接,实现与医院HIS系统的对接。 通过门诊医生和住…

HTML-CSS知识速查

HTML/CSS知识速查 文章目录 HTML/CSS知识速查[toc]网页的组成浏览器**为什么需要Web标准&#xff1a;** **web标准的构成&#xff1a;**HTMLHTML语法导读**1.1 HTML语法规则&#xff1a;**1.2 基本结构标签**1.3 标签的关系&#xff1a;**1. **包含关系&#xff08;Parent-Chil…

岩土工程监测新利器——振弦采集仪

岩土工程监测新利器——振弦采集仪 振弦采集仪是一种常用的岩土工程监测仪器&#xff0c;主要用于测量岩土体的振动和应变情况。它采用先进的数字信号处理技术&#xff0c;可以实时采集和处理振弦信号&#xff0c;快速准确地获取岩土体的振动和应变信息。 振弦采集仪具有以下优…

数据结构---树

树概念及结构 1.树的概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因 为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的 有一个特殊的结点&#xff0c…

在很多nlp数据集上超越tinybert 的新架构nlp神经网络模型

在很多nlp数据集上超越tinybert 的新架构nlp神经网络模型 网络结构图测试代码网络结构图 测试代码 import paddle import numpy as np import pandas as pd from tqdm import tqdmclass FeedFroward(paddle.nn.Layer):

TCP 基本认识

1&#xff1a;TCP 头格式有哪些&#xff1f; 序列号&#xff1a;用来解决网络包乱序问题。 确认应答号&#xff1a;用来解决丢包的问题。 2&#xff1a;为什么需要 TCP 协议&#xff1f; TCP 工作在哪一层&#xff1f; IP 层是「不可靠」的&#xff0c;它不保证网络包的交付…

SourceInsight - Relation Windows

磨刀不误砍柴工&#xff0c;你使用的工具决定了你的下限。我平时使用较多的代码编辑工具就是SourceInsight&#xff0c;这个工具速度快&#xff0c;操作方便&#xff0c;但处理非常大的项目的性能不是很理想&#xff0c;比如你要是添加整个Linux Kernel的源代码的话。 在使用SI…

什么是requestIdleCallback?和requestAnimationFrame有什么区别?

什么是requestIdleCallback? 我们都知道React 16实现了新的调度策略(Fiber), 新的调度策略提到的异步、可中断&#xff0c;其实就是基于浏览器的 requestIdleCallback和requestAnimationFrame两个API。 在 JavaScript 中&#xff0c;requestIdleCallback 是一个用于执行回调函…

Linguistic Steganalysis in Few-Shot Scenario论文阅读笔记

TIFS期刊 A类期刊 新知识点 Introduction Linguistic Steganalysis in Few-Shot Scenario模型是个预训练方法。 评估了四种文本加密分析方法&#xff0c;TS-CSW、TS-RNN、Zou、SeSy&#xff0c;用于分析和训练的样本都由VAE-Stego生产(编码方式使用AC编码)。 实验是对比在少样…

从零开始部署一个网站详细图文教程——腾讯云的服务器、SSL证书,阿里云的域名,七牛云的对象存储、CDN等

文章目录 前期准备连接服务器配置Golang环境安装配置MySQL安装配置Redis安装配置Nginx安装Node域名解析SSL证书下载启动项目配置CDN加速总结 前期准备 云服务器&#xff08;必备&#xff09;、已经备案的域名&#xff08;必备&#xff09;&#xff0c;已签发的SSL证书&#xf…

ssh-keygen(centos)

A—免密登陆—>B (1)A 机器&#xff0c;通过命令”ssh-keygen -t rsa“, 生成id_rsa,id_rsa.pub authorized_keys:存放远程免密登录的公钥,主要通过这个文件记录多台机器的公钥 id_rsa : 生成的私钥文件 id_rsa.pub &#xff1a; 生成的公钥文件 know_hosts : 已知的主机公钥…