【数据结构】从顺序表到ArrayList类

在这里插入图片描述

文章目录

  • 1.线性表
    • 1.1线性表的概念
    • 2.顺序表
    • 2.1顺序表的概念
    • 2.2顺序表的实现
    • 2.3接口的实现(对数组增删查改操作)
      • 3.ArrayList简介
        • 4. ArrayList使用
    • 4.1ArrayList的构造
    • 4.2 ArrayList的方法
    • 4.3 ArrayList的遍历

1.线性表

1.1线性表的概念

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

2.顺序表

2.1顺序表的概念

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

2.2顺序表的实现

因为顺序表存储数据是在一段连续的物理地址依次存储的线性结构,我们一般采用数组的形式来进行存储,通过在数组中完成数据的增删查改的操作。
2.2.1数组的创建

public class MyArrayList {
//定义一个未被初始化的数组elempublic int[] elem;//定义一个记录该数组存了多少容量public int size;//将该容量设置为一个常量,为了到后面调构造方法的时候初始化数组的大小public static final int DEFAULT_CAPACITY = 5;//调用构造函数的时候初始化数组的大小,而size成员变量不需要初始化,因为一开始未被初始化,默认初始化为0.public MyArrayList() {this.elem = new int[DEFAULT_CAPACITY];}
}

2.2.2提供一些接口

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 isFuul();boolean isEmpty();
}

2.2.3提供一些异常类
1.判断数组中是否为空的异常
2.判断下标是否合法的异常

//1.判断数组中是否为空的异常
public class EmptyException extends RuntimeException{public EmptyException() {}public EmptyException(String message) {super(message);}
}
//2.判断下标是否合法的异常
public class PosException extends RuntimeException{public PosException() {}public PosException(String message) {super(message);}
}

2.3接口的实现(对数组增删查改操作)

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

 //往最后位置插入数据public void add(int data) {//判断空间是否满了,如果满了就扩容2倍if(isFuul()) {elem = Arrays.copyOf(elem,2*elem.length);System.out.println("扩容成功");}elem[size] = data;size++;}@Overridepublic boolean isFuul() {return size == elem.length;}

2.3.2打印数组全部内容

//打印数组全部内容@Overridepublic void display() {for (int i = 0; i < size; i++) {System.out.println(elem[i]);}}

2.3.3在 pos 位置新增元素

 // 在 pos 位置新增元素@Overridepublic void add(int pos, int data) {//判断pos是否合法checkPosOfAdd(pos);//判断是否需要扩容if(isFuul()) {elem = Arrays.copyOf(elem,2*elem.length);}//最后在pos位置插入新元素for(int i=size-1;i>=pos;i--) {elem[i+1] = elem[i];}elem[pos] = data;size++;}//判断pos是否合法的方法,在顺序表中插入数据的时候,插入的位置前面必须要有数据。private void checkPosOfAdd (int pos) {if(pos<0 || pos>size) {throw new PosException("pos的位置不合法:"+pos);}}

2.3.4判定是否包含某个元素

// 判定是否包含某个元素//直接遍历数组然后一一和目标元素比较,有就返回true,没有就返回false。@Overridepublic boolean contains(int toFind) {for(int i=0;i< elem.length;i++) {if(toFind == elem[i]) {return true;}}return false;}

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

// 查找某个元素对应的位置//直接遍历数组然后一一和目标元素比较,有就返回对应的下标,没有就返回-1。@Overridepublic int indexOf(int toFind) {for(int i=0;i< elem.length;i++) {if(toFind == elem[i]) {return i;}}return -1;}

2.3.6 获取 pos 位置的元素 如果顺序表为空返回-1或者抛出异常,不为空返回pos位置的元素

// 获取 pos 位置的元素 如果顺序表为空返回-1或者抛出异常,不为空返回pos位置的元素@Overridepublic int get(int pos) {//判断pos位置是否合法checkPosOfGet(pos);//判断这个顺序表是否为空if(isEmpty()) {throw new EmptyException("顺序表为空");}return elem[pos];}

2.3.7判断顺序表是否为空

 //判断顺序表是否为空@Overridepublic boolean isEmpty() {return size == 0;}//判断pos合不合法的方法private void checkPosOfGet (int pos) {if(pos<0 || pos>size) {throw new PosException("pos的位置不合法:"+pos);}}

2.3.8给 pos 位置的元素设为 value

 // 给 pos 位置的元素设为 value@Overridepublic void set(int pos, int value) {//判断pos是否合法checkPosOfSet(pos);//判断顺序表是否为空if(isEmpty()) {throw new EmptyException("顺序表为空");}//修改pos位置的内容this.elem[pos] = value;}private void checkPosOfSet (int pos) {if (pos < 0 || pos > size) {throw new PosException("pos的位置不合法:" + pos);}}

2.3.9删除元素 如果顺序表中为空,则删不了,之后我们先找到我们要删的这个数。

//删除元素 如果顺序表中为空,则删不了,之后我们先找到我们要删的这个数。@Overridepublic void remove(int toRemove) {//判断顺序表中是否为空if(isEmpty()) {throw new EmptyException("顺序表为空");}//找到我们需要删的这个数int indexof = indexOf(toRemove);for(int i = indexof;i<size-1;i++) {elem[i] = elem[i+1];}size--;}

2.3.10获取顺序表长度 直接返回size

// 获取顺序表长度 直接返回size@Overridepublic int size() {return this.size;}

2.3.11清空顺序表

// 清空顺序表@Overridepublic void clear() {size = 0;}

3.ArrayList简介

在集合框架中,ArrayList是一个普通的类,实现了List接口,具体框架图如下:
在这里插入图片描述
【说明】

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

4.1ArrayList的构造

1.ArrayList() 无参构造:

List<Integer> list1 = new ArrayList<>();

2.ArrayList(int initialCapacity)指定顺序表初始容量:

List<Integer> list2 = new ArrayList<>(5);

3.ArrayList(Collection<? extends E> c) 利用其他 Collection 构建 ArrayList:相当于传入其他的ArrayList顺序表,使得这个顺序表的大小容量与数据类型和传入的顺序表是一致的。

List<Integer> list3 = new ArrayList<>(list2);

4.2 ArrayList的方法

4.2.1尾插法

public static void main(String[] args) {List<Integer> list2 = new ArrayList<>(5);list2.add(1);list2.add(2);list2.add(3);list2.add(4);list2.add(5);System.out.println(list2);}

结果显示:
在这里插入图片描述
4.2.2将目标值插到指定index位置

 list2.add(1,6);System.out.println(list2);

结果显示:
在这里插入图片描述
4.2.3删除 index 位置元素

 list2.remove(2);System.out.println(list2);

结果显示:
在这里插入图片描述
4.2.4获取下标 index 位置元素

System.out.println(list2.get(3));

结果显示:
在这里插入图片描述

4.3 ArrayList的遍历

ArrayList 可以使用三方方式遍历:for循环+下标、foreach。
1.for循环+下标:

 public static void main(String[] args) {List<Integer> list2 = new ArrayList<>(5);list2.add(1);list2.add(2);list2.add(3);list2.add(4);list2.add(5);for (int i = 0; i < list2.size(); i++) {System.out.print(list2.get(i)+" ");}}

结果显示:
在这里插入图片描述
2.foreach:

public static void main(String[] args) {List<Integer> list2 = new ArrayList<>(5);list2.add(1);list2.add(2);list2.add(3);list2.add(4);list2.add(5);System.out.println("foreach循环下:");for (Integer integer:list2) {System.out.print(integer+" ");}}

结果显示:
在这里插入图片描述
最后,ArrayList是一个动态类型的顺序表,不够空间会自动扩容。

好久没更新了,在这我向我的老铁们道个歉,从今天开始更新关于java的数据结构的内容,希望大家多多支持。🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹

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

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

相关文章

postgres面试题

《PostgreSQL面试题集锦》学习与回答_pg面试-CSDN博客 postgresql 数据库面试题及知识梳理_51CTO博客的技术博客_51CTO博客 PostgreSQL问答&#xff08;面试&#xff09;- 2211_51CTO博客的技术博客_51CTO博客 PostgreSQL问答&#xff08;面试&#xff09;- 2210_51CTO博客的…

微信怎么设置自动回复?教程来咯!

自动回复信息 你有没有为了回复微信消息&#xff0c;中断工作进度&#xff0c;耽误了大量时间&#xff1f;或者错过了潜在客户&#xff1f;现在&#xff0c;我们的微信管理系统&#xff0c;可以帮助你在第一时间&#xff0c;实时回复用户消息。 01 # 通过好友自动打招呼# 我们…

CTF CRYPTO 密码学-5

题目名称&#xff1a;山岚 题目描述&#xff1a; 山岚 f5-lf5aa9gc9{-8648cbfb4f979c-c2a851d6e5-c} 解题过程&#xff1a; Step1&#xff1a;根据题目提示栅栏加密 分析 观察给出的密文发现有f、l、a、g等字符有规律的夹杂的密文中间&#xff0c;看出都是每3个字符的第1…

springboot集成tess4j

spring整合tess4j用于OCR识别图片&#xff0c;在windows环境识别正常&#xff0c;在liunx没有反应&#xff0c;本文用于解决部署linux问题。 整合springboot 1、引入pom文件 <dependency><groupId>net.sourceforge.tess4j</groupId><artifactId>tess…

linux文件系统 - 初始化(三)

https://www.cnblogs.com/alantu2018/p/8447309.html 执行init程序 一、目的 内核加载完initrd文件后&#xff0c;为挂载磁盘文件系统做好了必要的准备工作&#xff0c;包括挂载了sysfs、proc文件系统&#xff0c;加载了磁盘驱动程序驱动程序等。接下来&#xff0c;内核跳转…

Kubernetes中拉取Harbor私有镜像

1、首先&#xff0c;确保已经安装了Docker并配置好了与Harbor的连接。可以使用docker login <harbor地址>命令登录到Harbor仓库。 创建一个Secret对象来存储Harbor的认证信息。可以通过运行以下命令生成该Secret对象&#xff1a; kubectl create secret docker-registry…

three.js从入门到精通系列教程002 - three.js正交相机OrthographicCamera

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>three.js从入门到精通系列教程002 - three.js正交相机OrthographicCamera</title><script src"ThreeJS/three.js"></script><script src&qu…

如果查看iPhone的GPU

摘要 了解你的显卡对于在电脑上玩现代图形要求高的游戏非常重要。本文介绍了如何轻松查看你的显卡型号以及为什么显卡在玩电脑游戏时如此关键。 引言 随着电脑游戏的发展&#xff0c;现代游戏对硬件性能的要求越来越高。十年前发布的显卡已经无法满足当前游戏的需求。因此&…

项目管理经验总结

需求优先级管理 需求插入&#xff1a; 如果有紧急需求&#xff0c;或高优先级需求优先其它开发资源&#xff0c;如果现有的人力资源都被占用&#xff0c;可以挂起旧需求、插入新需求。 需求阶段 要点&#xff1a; 确保需求无缺失、无漏洞、无歧义、大小合适。确保开发/测试对需…

什么叫特征分解?

特征分解&#xff08;Eigenvalue Decomposition&#xff09;是将一个方阵分解为特征向量和特征值的过程。对于一个 nn 的方阵A&#xff0c;其特征向量&#xff08;Eigenvector&#xff09;v 和特征值&#xff08;Eigenvalue&#xff09; λ 满足以下关系&#xff1a; 这可以写…

【Linux】:线程池(逐行解析代码)

线程池 一.概念二.模拟实现一个线程池 一.概念 一种线程使用模式。线程过多会带来调度开销&#xff0c;进而影响缓存局部性和整体性能。而线程池维护着多个线程&#xff0c;等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅…

Distributed Transactions at Scale in Amazon DynamoDB——论文泛读

ATC 2023 Paper 论文阅读笔记整理 问题 NoSQL云数据库服务因其简单的键值操作、高可用性、高可扩展性和可预测的性能而广受欢迎。尽管NoSQL数据库很实用&#xff0c;但它们通常不支持事务。 键值存储等NoSQL数据库是关系数据库的一种替代方案&#xff0c;它强调可扩展性和性…

博捷芯划片机在半导体芯片切割领域的领先实力

在当今高速发展的半导体行业中&#xff0c;芯片切割作为制造过程中的核心技术环节&#xff0c;对设备的性能和精度要求日益提升。在这方面&#xff0c;国内知名划片机企业博捷芯凭借其卓越的技术实力和持续的创新精神&#xff0c;成功研发出具备完全自主知识产权的半导体切割划…

FFmpeg教程:libswscale对图像进行简单处理

我们在FFmpeg简单总结对FFmpeg 组成模块&#xff0c;编码进行了简单介绍。 FFmpeg组成部分&#xff1a; libavcodec&#xff1a; 提供了音视频编解码器的库。 libavformat&#xff1a; 处理多媒体容器格式的库&#xff0c;包括封装和解封装。 libavutil&#xff1a; 包含一些公…

MySQL 8.3 发布,具体有哪些新增和删减?

MySQL 8.3 主要更新&#xff1a;用于标记事务分组的 GTID、JSON EXPLAIN 格式增强、一些功能删除等。 MySQL 是一款广泛使用的开源的关系型数据库管理系统&#xff0c;已推出其最新版本 MySQL 8.3。它带来了新功能和一些删除&#xff0c;有望简化数据库操作。让我们来看看有哪些…

基本的 Socket 模型

什么是Socket Socket 的中文名叫作插口&#xff0c;咋一看还挺迷惑的。事实上&#xff0c;双方要进行网络通信前&#xff0c;各自得创建一个 Socket&#xff0c;这相当于客户端和服务器都开了一个“口子”&#xff0c;双方读取和发送数据的时候&#xff0c;都通过这个“口子”…

用通俗易懂的方式讲解:太棒了!构建大模型 Advanced RAG(检索增强生成)的速查表和实战技巧最全总结来了!

新的一年开始了&#xff0c;也许您正打算通过构建自己的第一个RAG系统进入RAG领域。或者&#xff0c;您可能已经构建了基本的RAG系统&#xff0c;现在希望将它们改进为更高级的系统&#xff0c;以更好地处理用户的查询和数据结构。 无论哪种情况&#xff0c;了解从何处或如何开…

c++类与对象(五):友元、内部类、临时对象、匿名对象

上次重新再次补全了构造函数的内容&#xff0c;以及static成员&#xff1a;C类与对象&#xff08;四&#xff09;&#xff1a;再谈构造函数&#xff08;详解初始化列表&#xff09;、Static成员 今天就来进行类与对象最后一部分的内容 文章目录 1.友元1.1友元函数1.2友元类 2.内…

JVM系列-4.类加载器

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring原理、JUC原理、Kafka原理、分布式技术原理、数据库技术、JVM原理&#x1f525;如果感觉博主的文…

LeetCode670.最大交换

我真的怀疑他是不是难度等级评错了&#xff0c;因为感觉没到中级&#xff0c;总之先看题吧 给定一个非负整数&#xff0c;你至多可以交换一次数字中的任意两位。返回你能得到的最大值。 示例 1 : 输入: 2736 输出: 7236 解释: 交换数字2和数字7。示例 2 : 输入: 9973 输出:…