手把手教你如何实现List——ArrayList

目录

前言:

 线性表

顺序表

  接口的实现

一. 打印顺序表

二.新增元素,默认在数组最后新增

三.在 pos 位置新增元素 

四.判定是否包含某个元素

 五. 查找某个元素对应的位置

 六.获取 pos 位置的元素

七.给 pos 位置的元素设为 value 

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

九.获取顺序表长度

十.清空顺序表 

ArrayList的遍历

ArrayList的问题及思考

前言:

什么是List?

在集合框架中,List是一个接口,继承自Collection。

站在数据结构的角度来看,List就是一个线性表,即n个具有相同类型元素的有限序列,在该序列上可以执行增删改查以及变量等操作。 

List中提供了好的方法,具体如下:

 

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

本篇我们开始 ArrayList的学习


 线性表

线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列...

线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。


顺序表

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

  接口的实现

先初始化数组 

有效数字现在为useSize 

模拟实现接口里面的所有的功能  也基本上就学会了顺序表的所有功能

实现在MyArrayList这个类中重写

一. 打印顺序表

 打印顺序表比较简单,知道它的userSize,遍历一遍就可以

public void display() {for (int i = 0; i < useSize ; i++) {System.out.print(elem[i] + "");}System.out.println();}

二.新增元素,默认在数组最后新增

思路: 直接找到userSize位置,直接赋值就行 有效数组userSize为4

假如我们需要添加5,直接在下标为4的位置上赋值

添加完userSize++

考虑问题要全,如果数组满了,我们需要给它扩容已被才可以添加 

所有得先判断是否数组满了,如果满了先扩容再添加

代码实现:

public void add(int data) {//判断if(useSize == 5) {elem = Arrays.copyOf(elem,elem.length*2);}//添加elem[useSize] = data;useSize++;}

 效果:


三.在 pos 位置新增元素 

 

在1下标添加11 

应该把1下标后面的元素往后面移动  从userSzie-1下标开始向右移动 

并且得先从最右边的元素开始移动

最后userSize++;

考虑情况:  

另外pos下标值不能小于0或者大于usersize

代码实现: 

 public void add(int pos, int data) {//先检查是否数组满了吗?if(useSize == 5) {elem = Arrays.copyOf(elem,elem.length*2);}// 判断pos是否合法if(pos < 0 || pos > useSize) {//抛出异常throw new PosException("pos未知不合法" + pos);}for (int i = useSize - 1; i >= pos ; i--) {elem[i+1] = elem[i];}elem[pos] = data;useSize++;}

 


四.判定是否包含某个元素

 

遍历整个数组,再判断

代码实现:  

   public boolean contains(int toFind) {for (int i = 0; i < useSize; i++) {if(elem[i] == toFind) {return true;}}return false;}

 五. 查找某个元素对应的位置

代码实现:  

   public int indexOf(int toFind) {for (int i = 0; i < useSize; i++) {if(elem[i] == toFind) {return i;}}return -1;}


 六.获取 pos 位置的元素

 

这里的pos不能等于userSize了,否则越界了 

代码实现:  

   public int get(int pos) {判断pos是否合法if(pos < 0 || pos >= useSize) {//抛出异常throw new PosException("pos未知不合法" + pos);}return elem[pos];}

七.给 pos 位置的元素设为 value 

代码实现:  

 public void set(int pos, int value) {// 判断pos是否合法if(pos < 0 || pos > useSize) {//抛出异常throw new PosException("pos未知不合法" + pos);}elem[pos] = value;}


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

 

先判断顺序表是否为空 空的不可以删除的

删除结束userSize-- 

 代码实现:  

    public void remove(int toRemove) {if(useSize == 0){throw new EmptyException("顺序表为空");}//获取toRemove下标int index = indexOf(toRemove);for (int i = index; i < useSize - 1 ; i++) {elem[i] = elem[i+1];}useSize--;}

九.获取顺序表长度

 public int size() {return useSize;}

十.清空顺序表 

 public void clear() {useSize = 0;}

 以上基本上就是顺序表所有的基本操作 


ArrayList的遍历

一:直接打印

 二:for循环遍历

三. for each遍历

 四.使用迭代器


ArrayList的问题及思考

1. ArrayList底层使用连续的空间,任意位置插入或删除元素时,需要将该位置后序元素整体往前或者往后搬移,故时间复杂度为O(N)
2. 增容需要申请新空间,拷贝数据,释放旧空间。会有不小的消耗。
3. 增容一般是呈2倍的增长,势必会有一定的空间浪费。例如当前容量为100,满了以后增容到200,我们再继续插入了5个数据,后面没有数据插入了,那么就浪费了95个数据空间。

当在ArrayList任意位置插入或者删除元素时,就需要将后序元素整体往前或者往后
搬移,时间复杂度为O(n),效率比较低,因此ArrayList不适合做任意位置插入和删除比较多的场景。

接下来我们会进行 LinkedList(链表)的学习

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

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

相关文章

Prometheus的详细部署

普罗米修斯下载网址: Download | Prometheus 准备两台机器&#xff1a; 192.168.58.152 prometheus 192.168.58.142 node_exporter 关闭防火墙和selinux&#xff1a; [rootlocalhost ~]# setenforce 0 && systemctl stop firewalld[rootlocalhost ~]# seten…

Baby-Step Giant-Step Homomorphic DFT

参考文献&#xff1a; [CT65] Cooley J W, Tukey J W. An algorithm for the machine calculation of complex Fourier series[J]. Mathematics of computation, 1965, 19(90): 297-301.[Shoup95] Shoup V. A new polynomial factorization algorithm and its implementation[…

【数据结构 —— 二叉树的链式结构实现】

数据结构 —— 二叉树的链式结构实现 1.树的概念及其结构1.1.树概念1.2.树的结构1.3树的相关概念1.4.树的表示1.5. 树在实际中的运用&#xff08;表示文件系统的目录树结构&#xff09; 2.二叉树的概念及其结构2.1二叉树的概念2.2.现实中的二叉树&#xff1a;2.3. 特殊的二叉树…

国产操作系统-银河麒麟V10

一、介绍 银河麒麟操作系统隶属于麒麟软件&#xff0c;麒麟软件是专业从事国产操作系统研发和产业化的企业&#xff0c;面向通用和专用领域打造安全创新的国产操作系统产品和相应解决方案&#xff0c;旗下拥有银河麒麟、中标麒麟、星光麒麟三大产品品牌。 麒麟软件官方网站地…

Shell条件变量练习

1.算数运算命令有哪几种&#xff1f; (1) "(( ))"用于整数运算的常用运算符&#xff0c;效率很高 [rootshell scripts]# echo $((24*5**2/8)) #(( ))2452814 14 (2) "$[ ] "用于整数运算 [rootshell scripts]# echo $[24*5**2/8] #[ ]也可以运…

Windows10系统卸载服务和删除服务

记录一下Windows10系统卸载服务和删除服务 最近在使用自己win电脑的时候 发现服务里存在很久之前就没有使用的应用&#xff0c;对应的文件夹也都已经删除了&#xff0c;但是在win服务里一直存在&#xff0c;不知道会不会影响性能&#xff0c;看着吧还是强迫自己删掉好一些&…

解决:SyntaxError: Non-UTF-8 code starting with À in file but no encoding declared

解决&#xff1a;SyntaxError: Non-UTF-8 code starting with in file but no encoding declared 文章目录 解决&#xff1a;SyntaxError: Non-UTF-8 code starting with in file but no encoding declared背景报错问题报错翻译报错原因解决方法使用utf-8格式使用gbk格式今天…

Linux新加磁盘的完整步骤

目录 新加磁盘的完整步骤磁盘分区磁盘文件命名经典分区方案fdiskparted 分区格式化挂载分区 新加磁盘的完整步骤 物理连接 --> 分区 --> 格式化 --> 挂载 --> 更新/etc/fstab文件实现永久挂载 磁盘分区 主分区primary用来安装操作系统、存放数据&#xff0c;可以…

【攻防世界-misc】hong

1.下载解压文件&#xff0c;是个音频文件&#xff0c;但打不开 2.复制到kali中先拆分看音频里面有隐含文件没有 用到的命令是&#xff1a;foremost 桌面/hong.mp3 点击桌面上的主文件夹 点击“output”文件夹&#xff0c; 点击文件中的jpg文件夹&#xff0c;有两张图片&#…

【古月居《ros入门21讲》学习笔记】14_参数的使用与编程方法

目录 说明&#xff1a; 1. 参数模型&#xff08;全局字典&#xff09; 2. 实现过程&#xff08;C&#xff09; 创建功能包 参数命令行的使用 YAML参数文件 rosparam命令 使用示例 编程方法&#xff08;C&#xff09; 配置代码编译规则 编译并运行 编译 运行 3. 实…

uni-app x生成的安卓包,安装时,提示不兼容。解决方案

找到 manifest.json 进入&#xff1a;源码视图 代码 {"name" : "xxx康养","appid" : "__xxx6","description" : "xxx康养","versionName" : "1.0.12","versionCode" : 100012,&…

【CAD二次开发】标注箭头,获取修改标注箭头图块

常见的的标注箭头有以下种类 public static List<string> ArrowBlock = new List<string>(){" ","_CLOSEDBLANK&