【Java--数据结构】模拟实现ArrayList

欢迎关注个人主页:逸狼


创造不易,可以点点赞吗~

如有错误,欢迎指出~



目录

LIst

顺序表ArrayList

顺序表优点

IList接口

ArrayList中定义要操作的数组

在MyArrayList中 重写接口方法

新增元素

在指定位置插入元素

 pos不合法异常

判断和查找元素

获取和更新元素

删除元素和清空顺序表

获取顺序表的长度和打印顺序表


LIst

List是个接口,并不能直接用来实例化。 如果要使用,必须去实例化List的实现类。在集合框架中,ArrayList和LinkedList都实现了List接口。

  • ArrayList:实现了List接口,底层为动态类型顺序表
  • LinkedList:实现了List接口,底层为双向链表

 Java类和接口总览

顺序表ArrayList

顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成 数据的增删查改。

顺序表优点

适合根据 下标进行 查找 和 更新 的场景

访问速度比较快(在给定下标的情况下可以达到O(1)

下面我们要自己模拟实现一个 顺序表MyArrayList,理解它底层的数据结构原理,方便我们未来更好的使用ArrayList中的方法。

IList接口

package arrayList;public interface IList {// 新增元素,默认在数组最后新增void add(int data);// 在 pos 位置新增元素void add(int pos, int data) ;// 判定是否包含某个元素boolean contains(int toFind);// 查找某个元素对应的位置int indexOf(int toFind) ;// 获取 pos 位置的元素int get(int pos) ;//给 pos 位置的元素设为 valuevoid set(int pos, int value) ;//删除第一次出现的关键字keyvoid remove(int toRemove) ;// 获取顺序表长度int size() ;// 清空顺序表void clear();// 打印顺序表,注意:该方法并不是顺序表中的方法,为了方便看测试结果给出的void display() ;boolean isFull();
}

ArrayList中定义要操作的数组

package arrayList;import java.util.Arrays;
//定义顺序表,实现IList 接口
public class MyArrayList implements IList{//定义要操作的数组public int[]elem;public int usedSize;//数组中存储的数据个数public MyArrayList(){this.elem=new int[10];//表示数组长度是10}

在MyArrayList中 重写接口方法

新增元素

    @Override     // 新增元素,默认在数组最后新增public void add(int data) {//如果满了,要扩容if(isFull()){//扩容elem= Arrays.copyOf(elem,2*elem.length);}this.elem[usedSize]=data;this.usedSize++;}@Override//用于判断顺序表是否满了public boolean isFull() {return usedSize==elem.length;}

在指定位置插入元素

@Override     // 在 pos 位置新增元素public void add(int pos, int data) {//插入数据的时候一定要保证插入的位置前面有数据try{checkPosOfAdd(pos);}catch (PosNotLegalException e){e.printStackTrace();}//判断是否满了if(isFull()){elem= Arrays.copyOf(elem,2*elem.length);}//移动元素for (int i = usedSize-1; i>=pos  ; i--) {elem[i+1]=elem[i];}//插入元素elem[pos]=data;usedSize++;}//该方法用来 判断添加元素时 pos是否合法private void checkPosOfAdd(int pos){if(pos<0||pos>usedSize){throw new PosNotLegalException("在pos位置插入元素时Pos位置不合法。。。");//抛出一个异常}}

 pos不合法异常

package arrayList;
//定义一个异常,用于对pos不合法时的报警
public class PosNotLegalException extends RuntimeException{public PosNotLegalException(){}public PosNotLegalException(String msg){super(msg);}
}

判断和查找元素

    @Override     // 判定是否包含某个元素public boolean contains(int toFind) {//只需要找usedSize次for (int i = 0; i < usedSize; i++) {if(elem[i]==toFind){return true;}}return false;}@Override     // 查找某个元素对应的位置public int indexOf(int toFind) {for (int i = 0; i < usedSize; i++) {if(elem[i]==toFind){return i;//与上面contains方法的代码一样,只是返回的是下标}}return -1;}

获取和更新元素

 //get/set时,判断pos是否合法private void checkPosOfGet(int pos)throws PosNotLegalException{if(pos<0||pos>=usedSize){throw new PosNotLegalException("get/set获取元素的时候pos位置不合法。。。");}}@Override     // 获取 pos 位置的元素public int get(int pos) {try{checkPosOfGet(pos);}catch (PosNotLegalException e){e.printStackTrace();}return elem[pos];}@Override     //给 pos 位置的元素设为 value   更新pos位置的值为valuepublic void set(int pos, int value) {try{checkPosOfGet(pos);}catch (PosNotLegalException e){e.printStackTrace();}elem[pos]=value;}

删除元素和清空顺序表

 @Override     //删除第一次出现的关键字keypublic void remove(int toRemove) {//要查找是否查找要删除的关键字 toRemoveint pos =indexOf(toRemove);if(pos==-1){System.out.println("没有要删除的数字!");return;}for (int i = 0; i < usedSize-1; i++) {elem[i]=elem[i+1];}usedSize--;}@Override     // 清空顺序表public void clear() {//1.如果是数组元素,直接将usedSize置为0//2.如果是引用类型,则置为null/*        for (int i = 0; i < usedSize; i++) {elem[i]=null;}*/usedSize=0;//这里是数组}

获取顺序表的长度和打印顺序表

@Override     // 获取顺序表长度public int size() {return usedSize;}@Override //打印顺序表public void display() {for (int i = 0; i < usedSize; i++) {System.out.print(elem[i]+" ");}System.out.println();}

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

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

相关文章

二维码相册怎么做?图片转换为二维码的方法

二维码现在可以用来承载大量的内容&#xff0c;通过扫描二维码即可通过扫描设备获取信息。图片生成二维码之后&#xff0c;用户可以在不保存图片直接扫码来查看图片&#xff0c;这种方式可以有效的提高图片的安全性&#xff0c;防止图片信息泄露。 怎么用二维码来作为相册展现…

STM32F401RCT6电子元器件芯片LQFP64 32位微控制器MCU单片机

STM32F401RCT6微控制器具有丰富的外设接口和较高的处理能力&#xff0c;适用于多种嵌入式应用。以下是一些典型的STM32F401RCT6应用案例&#xff1a; 1. 机器人控制&#xff1a;STM32F401RCT6可以用于制作自动导航机器人、遥控机器人等&#xff0c;负责处理传感器数据、控制电…

Centos7虚拟机与真机乎ping以及虚拟机ping不通的原因

虚拟机网络完全正常的标准 物理机可以ping通虚拟机的IP虚拟机可以ping通物理机的IP虚拟机可以ping通baidu.com等网站 使用工具版本&#xff1a;Centos7 前提&#xff1a; 虚拟机必须开机才可以连接访问 克隆出来的虚拟机一定要手动修改IP&#xff0c;IP冲突的情况下不能联网 …

android开发 使用Messenger进行进程间通信

Messenger有两个构造方法。 Messenger recevierMessenger new Messenger(IBinder target)&#xff1b; Messenger recevierMessenger new Messenger(Handler target)&#xff1b; 能传handler和ibinder&#xff0c; 服务端进程 com.jn.testmessagerservice 创建一个servic…

水位传感器优点有哪些

水位传感器是一种用于检测液体水位的重要设备&#xff0c;在各种工业和民用场景中起着至关重要的作用。其中&#xff0c;光学液位传感器作为一种先进的水位检测技术&#xff0c;在市场上备受青睐&#xff0c;其优点主要包括以下几个方面。 光学液位传感器内部所有元器件均经过…

基于一款最多能够支持10000路的 modbus RS485 led灯光控制板做灯控程序

背景 介绍一款之前用过的一款设备&#xff0c;基于RS485通讯协议&#xff0c;控制LED灯或RGB灯带。 设备介绍 之前用它来做智能中药柜的灯控板&#xff0c;结合物联网网关&#xff0c;modbus采集&#xff0c;mqtt转发&#xff0c;以及mqtt的rpc指令下发 设备图片 功能说明 …

LPA算法简介

1. 背景 标签传播算法(Label Propagation Algorithm)是一种基于图的半监督学习方法&#xff0c;其基本思路是用已标记节点的标签信息去预测未标记节点的标签信息。 2. 算法流程 1. 为每个节点随机的指定一个自己特有的标签&#xff1b; 2. 逐轮刷新所有节点的标签&#xff0…

前沿论文 | LLM推理性能优化最佳实践

原文&#xff1a;安全验证 - 知乎​ 来源 题目&#xff1a;LLM Inference Performance Engineering: Best Practices 地址&#xff1a;https://www.databricks.com/blog/llm-inference-performance-engineering-best-practices 在这篇博文中&#xff0c;MosaicML工程团队分析了…

2024-4-22 群讨论:微服务启动预热相关

以下来自本人拉的一个关于 Java 技术的讨论群。关注公众号&#xff1a;hashcon&#xff0c;私信进群拉你 Hotspot JVM 进程启动后&#xff0c;流量到来的时候 JIT 吃掉很多 CPU&#xff0c;如何观察到&#xff1f; 很多途径都能观察到&#xff1a; top -Hp&#xff1a;这个需…

ApiHug 的初心-ApiHug101

视频 秒懂 ApiHug -019 HOPE &#x1f525; H.O.P.E.: Help other people excellent &#x1f49d; 是这个项目最初的初心 &#x1f917; ApiHug {Postman|Swagger|Api...} 快↑ 准√ 省↓ &#x1f3e0; gitee github search ApiHug ApiHug &#x1f917; ApiHug {Post…

云架构(五)BBF模式

BFF模式&#xff08;Backends for Frontends pattern&#xff09;- https://learn.microsoft.com/en-us/azure/architecture/patterns/backends-for-frontends。 创建单独的后台服务用以提供给特定的前端或者接口。当你希望避免为多个接口定制单独的后台时&#xff0c;此模…

7天录用!录用→检索仅21天!CCF推荐毕业神刊

本周投稿推荐 SSCI • 2/4区经管类&#xff0c;2.5-3.0&#xff08;录用率99%&#xff09; SCIE&#xff08;CCF推荐&#xff09; • 计算机类&#xff0c;2.0-3.0&#xff08;最快18天录用&#xff09; SCIE&#xff08;CCF-C类&#xff09; • IEEE旗下&#xff0c;1/2…

限时疯抢!阿里云服务器十大优惠活动合集,手慢无

限时疯抢&#xff01;阿里云服务器十大优惠活动合集&#xff0c;手慢无阿里云服务器优惠活动&#xff08;2024年最新整理&#xff09;&#xff0c;阿里云服务器优惠活动大全、2024阿里云优惠政策整理&#xff0c;包括官方优惠活动主会场、2024年4月优惠活动分为&#xff1a;免费…

服务器(Linux、AIX)监控软件【nmon】使用

目录 1.安装 2.使用 3.使用 4.采集数据 5.查看log&#xff08;根据结果&#xff0c;生成报表&#xff09; 6.分析结果 1.安装 apt-get install nmon 2.使用 输入nmon进入下面的界面 x Use these keys to toggle statistics on/off: …

牛客网刷题 | BC60 判断是不是字母

描述 KiKi想判断输入的字符是不是字母&#xff0c;请帮他编程实现。 输入描述&#xff1a; 多组输入&#xff0c;每一行输入一个字符。 输出描述&#xff1a; 针对每组输入&#xff0c;输出单独占一行&#xff0c;判断输入字符是否为字母&#xff0c;输出内容详见输出样例…

加密、解密、签名、验签、数字证书、CA浅析

一、加密和解密 加密和解密应用的很广&#xff0c;主要作用就是防止数据或者明文被泄露。 加解密算法主要有两大类&#xff0c;对称加密和非对称加密。对称加密就是加密和解密的密钥都是一个&#xff0c;典型的有AES算法。非对称加密就是有公钥和私钥&#xff0c;公钥可以发布…

【Web】DASCTF X GFCTF 2024|四月开启第一局 题解(全)

目录 EasySignin cool_index SuiteCRM web1234 法一、条件竞争(没成功) 法二、session反序列化 EasySignin 先随便注册个账号登录&#xff0c;然后拿bp抓包改密码(username改成admin) 然后admin / 1234567登录 康好康的图片功能可以打SSRF&#xff0c;不能直接读本地文…

最详细步骤解决:Apps targeting Android12 and higher are required to specify...

问题原因&#xff1a; 当targetSdkVersion>31时&#xff0c;需要在AndroidManifest.xml中配置android:exported的值&#xff0c;该值为boolean类型。 android:exported解释&#xff1a; activity 是否可由其他应用的组件启动&#xff1a; 如果设为 "true"&#…

持续更新。。。

1、JAVA面试指南 https://javaguide.cn/ 简历优化&#xff1a;突出与应聘职位相关的项目经验、技术栈、技能证书和专业成就。确保简历中的技术关键词与JD&#xff08;Job Description&#xff09;相符。 自我评估&#xff1a;对照目标职位要求&#xff0c;梳理自身Java技能树&…

【磁盘根目录扩容】

目的 给磁盘的根目录扩容&#xff0c;每个人在服务器上在根目录操作的可能性更大&#xff0c;如果单独指定一个目录扩容&#xff0c;很有可能使用不当 步骤 未扩容时&#xff0c;查看到sda下有两个分区&#xff0c;目前要扩展追加一个分区 使用fdisk -l查看到sda有4.9T&…