数据结构:ArrayList与顺序表

news/2025/1/7 16:48:58/

目录

 📖一、什么是List

📖二、线性表

📖三、顺序表

🐬1、display()方法

🐬2、add(int data)方法

🐬3、add(int pos, int data)方法

🐬4、contains(int toFind)方法

🐬5、indexOf(int toFind)方法

🐬6、get(int pos)方法

🐬7、set(int pos, int value)方法

🐬8、remove(int toRemove)方法

🐬9、size()方法

🐬10、clear()方法

🐬11、完整代码 

📖四、ArrayList简介

📖五、ArrayList的构造 

🐬1、ArrayList()无参构造

🐬2、ArrayList(int initialCapacity))带参构造

🐬3、ArrayList(Collection c)利用Collection进行构造

📖六、ArrayList使用

🐬1、addAll(Collection c)方法

🐬2、remove(int index)方法

🐬3、remove(Object o)方法

🐬4、lastIndexOf(Object o)方法

🐬5、ListsubList(int fromIndex,int toIndex)方法

📖七、ArrayList的遍历 

🐬1、for循环+下标 

🐬2、for each

🐬3、迭代器


 📖一、什么是List

在集合框架中,List是一个接口,继承自Collection。而Collection也是一个接口,同时他有一些方法,因此List种有着许多的方法。

虽然有很多方法但我们只需要记住以下一些常用方法即可 

方法解释
boolean add(E e)尾插e
void add(int index, E element)将e插入到 index 位置
boolean addAll(Collection<? extends E> c)尾插c中的元素
E remove(int index)删除 index 位置元素
boolean remove(object o)删除遇到的第一个o
E get(int index)获取下标 index 位置元素
E set(int index, E element)将下标 index 位置元素设置为 element
void clear()清空
boolean contains(Object o)判断o是否在线性表中
int indexof(object o)返回第一个o所在下标
int lastIndexof(Object o)返回最后一个o的下标
List<E> subList(int fromindex, int tolndex)截取部分 list

📖二、线性表

线性表(linearlist)是n个具有相同特性的数据元素的有限序列。线性表是⼀种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列... 线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。

📖三、顺序表

顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。 在数组上他们通常表现为数据的增删查改。(顺序表具有扩容能力,通常以自身的1.5倍或2倍进行扩容)

然而我们知道数组是不具备增删查改的功能的,因此我们需要自己创建一个类,自己来实现自己创建IList接口

下面我们就来实现一个顺序表

🐬1、display()方法

打印顺序表

🐬2、add(int data)方法

新增元素 , 默认在数组最后新增(尾插)

🐬3、add(int pos, int data)方法

在 pos 位置新增元素

🐬4、contains(int toFind)方法

判定是否包含某个元素

🐬5、indexOf(int toFind)方法

查找某个元素对应的位置

🐬6、get(int pos)方法

获取 pos 位置的元素

🐬7、set(int pos, int value)方法

给 pos 位置的元素设为 value

🐬8、remove(int toRemove)方法

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

🐬9、size()方法

获取顺序表长度

🐬10、clear()方法

清空顺序表

🐬11、完整代码 

Ilist接口

java">package List;public interface IList {void add(int data);void add(int pos, int data);boolean contains(int toFind);int indexOf(int toFind);int get(int pos);void set(int pos, int value);void remove(int toRemove);int size();void clear();void display();
}

MyArrayList类 

java">import List.EmptyTable;
import List.IList;
import List.Illegality;import java.nio.channels.ScatteringByteChannel;
import java.util.Arrays;public class MyArrayList implements IList {public int[] arr;public int usedsize;public static final int DEFAULT_SIZE = 10;public MyArrayList(){this.arr = new int[DEFAULT_SIZE];}@Overridepublic void display() {for (int i = 0; i < this.usedsize; i++) {System.out.print(arr[i]+" ");}System.out.println();}@Overridepublic void add(int data) {if(isFull()){Expansion();}this.arr[this.usedsize] = data;this.usedsize++;}public boolean isFull(){return this.usedsize == DEFAULT_SIZE;}public void Expansion(){this.arr = Arrays.copyOf(this.arr, 2*this.arr.length);}@Overridepublic void add(int pos, int data) {try{check1(pos);if(isFull()){Expansion();}int right = this.usedsize;while(pos < right){arr[right] = arr[--right];}this.arr[pos] = data;this.usedsize++;}catch(Illegality e){e.printStackTrace();}}public void check1(int pos) throws Illegality{if( pos < 0 || pos > this.usedsize){throw new Illegality("pos不合法");}}@Overridepublic boolean contains(int toFind) {for (int i = 0; i < this.usedsize; i++) {if(this.arr[i] == toFind){return true;}}return false;}@Overridepublic int indexOf(int toFind) {for (int i = 0; i < this.usedsize; i++) {if(this.arr[i] == toFind){return i;}}return -1;}@Overridepublic int get(int pos) {try{empty();check2(pos);return this.arr[pos];}catch (Illegality e){e.printStackTrace();}catch (EmptyTable e){e.printStackTrace();}return -1;}public void check2(int pos) throws Illegality{if(pos < 0 || pos >= this.usedsize){throw new Illegality("pos不合法");}}public void empty() throws EmptyTable {if(this.usedsize == 0){throw new EmptyTable("顺序表为空");}}@Overridepublic void set(int pos, int value) {try{empty();check2(pos);this.arr[pos] = value;}catch (Illegality e){e.printStackTrace();}catch (EmptyTable e){e.printStackTrace();}}@Overridepublic void remove(int toRemove) {try{empty();int pos = indexOf(toRemove);if(pos == -1){return;}for (int i = pos; i < this.usedsize ; i++) {arr[pos] = arr[++pos];}this.usedsize--;}catch (EmptyTable e){e.printStackTrace();}}@Overridepublic int size() {return this.usedsize;}@Overridepublic void clear() {this.usedsize = 0;}}

异常 

java">package List;public class Illegality extends RuntimeException{public Illegality(String message){super(message);}
}
java">package List;public class EmptyTable extends RuntimeException{public EmptyTable(String message){super(message);}
}

主函数 

java">public class Test {public static void main(String[] args) {MyArrayList myArrayList = new MyArrayList();}
}

📖四、ArrayList简介

在上面我们自己实现了一个顺序表MyArrayList,但是在Java中编译器自带了一个顺序表ArrayList类,它同样实现了List接口,虽然它和我们自己实现的顺序表大同小异,但是它还有一些地方需要注意。

  • ArrayList是以泛型方式实现的,使用时必须要先实例化
  • ArrayList实现了RandomAccess接口,表明ArrayList⽀持随机访问
  • ArrayList实现了Cloneable接口,表明ArrayList是可以clone的
  • ArrayList实现了Serializable接口,表明ArrayList是支持序列化的
  • 和Vector不同,ArrayList不是线程安全的,在单线程下可以使用,在多线程中可以选择Vector或者 CopyOnWriteArrayList
  •  ArrayList底层是⼀段连续的空间,并且可以动态扩容,是⼀个动态类型的顺序表

📖五、ArrayList的构造 

🐬1、ArrayList()无参构造

🐬2、ArrayList(int initialCapacity))带参构造

🐬3、ArrayList(Collection<? extends E> c)利用Collection进行构造

而它传入的值是限制通配符的上界本身和他的子类 

📖六、ArrayList使用

ArrayList实现的顺序表是实现了List接口,大多的方法的使用是和我们自己实现的接口是一样的,因此下面我们会对那些不同的进行讲解

🐬1、addAll(Collection<? extends E> c)方法

尾插c中的元素

🐬2、remove(int index)方法

删除 index 位置元素

🐬3、remove(Object o)方法

删除遇到的第一个o

🐬4、lastIndexOf(Object o)方法

返回最后一个o的下标

IndexOf返回的是相同元素第一个出现的下标,而lastIndexOf返回的是最后一个的下标

🐬5、List<E>subList(int fromIndex,int toIndex)方法

截取部分 list

📖七、ArrayList的遍历 

ArrayList 可以使用三种方式遍历:for循环+下标、for each、使用迭代器

🐬1、for循环+下标 

🐬2、for each

🐬3、迭代器


好了今天的分享就到这里了,还请大家多多关注,我们下一篇见!


http://www.ppmy.cn/news/1561001.html

相关文章

深度学习blog-RAG构建高效生成式AI的优选路径

RAG&#xff08;Retrieval-Augmented Generation&#xff09; 随着人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;模型的性能和应用场景也不断扩展。其中&#xff0c;检索增强生成&#xff08;RAG, Retrieval-Augmented Generation&#xff09;模型作为一种新…

【软考网工笔记】计算机基础理论与安全——知识产权

1- 许可贸易 许可贸易实际上是一种许可方用授权的形式向被许可方转让技术使用权同时也让度一定市场的贸易行为。 根据其授权程度大小&#xff0c;许可贸易可分为如下五种形式&#xff1a; &#xff08;1&#xff09; 独占许可 它是指在合同规定的期限和地域内&#xff0c;被许…

Windows系统下FFmpeg4.4的环境搭建(二)

一、FFmpeg是什么 FFmpeg是一套可以用来记录、转换数字音频、视频&#xff0c;并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证&#xff0c;它提供了录制、转换以及流化音视频的完整方案。FFmpeg在linux平台下开发&#xff0c;但是它同样也可以在其它操作系统环境中编译…

基于Spring Boot智能无人仓库管理系统【附源码】

基于Spring Boot智能无人仓库管理系统 效果如下&#xff1a; 系统登陆页面 管理员主页面 员工管理页面 补货提醒管理页面 员工主页面 补货申请页面 取货申请管理页面 研究背景 随着全球化和信息技术的快速发展&#xff0c;企业的业务规模逐渐扩大&#xff0c;仓储作为企业供…

java根据Word模板实现动态填充导出图表,列表

本文基于文章【动态导出Word文档&#xff0c;poi-tl的前世今生及快速使用】&#xff0c;对文本、表格、图片、列表、图表等做详细的示例记录。 快速开始 引入依赖 <dependency><groupId>com.deepoove</groupId><artifactId>poi-tl</artifactId>…

面向对象分析和设计OOA/D,UML,GRASP

目录 什么是分析和设计&#xff1f; 什么是面向对象的分析和设计&#xff1f; 迭代开发 UML 用例图 交互图 基于职责驱动设计 GRASP 常见设计原则 什么是分析和设计&#xff1f; 分析&#xff0c;强调是对问题和需求的调查研究&#xff0c;不是解决方案。例如&#x…

java基础学习——java集合简单介绍及使用

集合概述 曾经如果想要保存一组数据&#xff0c;我们通常使用数组来实现&#xff0c;但是数组有一个致命缺点&#xff1a;就是定长&#xff0c;数组一旦被创建&#xff0c;长度就是固定的&#xff0c;无法改变&#xff0c;如果想要添加或删除一个数据&#xff0c;是无法在原数…

【C++】B2103 图像相似度

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;题目描述题目原文输入格式输出格式样例 &#x1f4af;题目分析目标核心公式输入规模 &#x1f4af;两种解法对比我的做法核心思路代码实现思路解析优点缺点 老师的做法核心…