【Java数据结构】深入解析ArrayList与顺序表


【Java数据结构】深入解析ArrayList与顺序表

 1.前言~🥳🎉🎉🎉  

2.ArrayList的介绍 

 3.使用ArrayList

3.1 ArrayList的构造方法 

3.11 第一个构造方法

3.12第二个构造方法 

3.13第三个构造方法 

3.2ArrayList中的tostring方法 

3.3ArrayList 的 add 方法 

 4.ArrayList的常用方法

4.1 addAll方法

 4.2subList方法

4.3ArrayList的常用方法总使用 

5.ArrayList的遍历 

 6.总结


 1.前言~🥳🎉🎉🎉  

hellohello~,大家好💕💕,这里是E绵绵呀✋✋ ,如果觉得这篇文章还不错的话还请点赞❤️❤️收藏💞 💞 关注💥💥,如果发现这篇文章有问题的话,欢迎各位评论留言指正,大家一起加油!一起chin up!👍👍 

💥个人主页:E绵绵的博客
💥所属专栏:JAVA知识点专栏   JAVA题目练习  c语言知识点专栏   c语言题目练习

在上一章我们将顺序表的模拟讲了之后,我们现在正式开始介绍ArrayList这个类(顺序表)。开始吧! 


参考文章:【Java 数据结构】顺序表_数据结构java顺序表基本算法测试-CSDN博客

2.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底层是一段连续的空间,并且可以动态扩容,是一个动态类型的顺序表


我们查看源码可知的确实施了这些接口。

这就是类定义的前部分,这里还是比较复杂的,会随着我们学习的深入,逐步学习到。

❤️❤️接下来我们来看ArrayList的几个成员变量:



对于第一个成员变量,我们无需了解,只需要关注下后面五个成员变量。

 3.使用ArrayList


3.1 ArrayList的构造方法 


3.11 第一个构造方法

当前是一个带参数的构造方法,很好理解,根据传递的参数开辟数组空间的大小。如果参数是等于0,就直接把 EMPTY_ELEMENTDATA 这个空数组赋值给存放数据的数组中。 如果是给定一个负数,显然是错误的,也即直接抛出异常!

3.12第二个构造方法 


对于这个无参构造方法居然也是给了一个空数组,也就是没有分配数组内存,那它到底是怎么把数据放进去的?别急,随着后面的讲解,我们会解开这个谜题。

3.13第三个构造方法 


里面涉及了泛型的进阶,我们这也不怎么好描述,就直接说特点吧:

下面是这个构造方法的一些特点:

参数c要求是实现了Collection接口的对象,

参数c中的<>元素类型必须与ArrayList中的<>元素类型兼容,即参数c中的<>元素类型必须是ArrayList中<>元素类型的子类或者相同类型。

在使用该构造方法后,它会按照参数c中元素的顺序将元素添加到新创建的ArrayList中。

实例如下:

public class Test {public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("apple");list.add("banana");list.add("orange");ArrayList<String> arrayList = new ArrayList<>(list);System.out.println(arrayList);}}


所以由这可知我们就将list内部的元素apple banana orange全部复制到Arraylist内部中(按顺序复制)。

3.2ArrayList中的tostring方法 

由上图可知我们的ArrayList重写了toString方法。所以在用println时,内部参数为ArrayList对象时其将打印出该对象内部的所有元素,以字符串形式打印出来。

例如,如果ArrayList中有三个元素 “apple”、“banana” 和 “orange”,那么调用println方法将打印出字符串 “[apple, banana, orange]”。

3.3ArrayList 的 add 方法 


别小看这几行代码,跟我们自己模拟实现的还是有区别的,真正有内涵的代码其实在 ensureCapacityInternal 这个方法中,那么现在,我们就一步步去解开他的面纱:

由这可知,我们就可以解开之前构造方法中的问题:我们用无参构造方法给其elementData一个空数组,也就是没有分配内存,那么它到底怎么存放数据进去?


我们看源码可知如果在使用add时elementData指向一个空数组,那么在使用add方法时内部的ensureCapacityInternal方法会给其element重新指向一个可以存放十个数据的数组,这样就可以存放数据了。


我们还从源码处可知在使用add时如果其数组中的数据已经满了,那么其会为该数组扩容1.5倍再存放数据。


所以这就是add的厉害之处。不仅能给内部为空数组的ArrayList对象重新开辟一个内部为10个数据的数组,使其能存放数据; 它还可以为满数据的数组实现扩容,使其也能存放数据。

 4.ArrayList的常用方法


在这里我们就重点讲两个方法 addAll和subList,

❤️❤️对于其他方法的使用,都很简单,自己去查源码,我这就不讲了。到了数据结构阶段,就要尝试着自己看源码,培养自主学习的能力!

4.1 addAll方法

ArrayList中的addAll方法是用于将另一个集合c中的所有元素添加到当前ArrayList对象中的方法。它的语法如下:

boolean addAll(Collection<? extends E> c)

其中有以下要求:

参数c要求是实现了Collection接口的对象,

参数c中的<>元素类型必须与ArrayList中的<>元素类型兼容,即参数c中的<>元素类型必须是ArrayList中<>元素类型的子类或者相同类型。


这个方法可以用于批量添加元素到ArrayList对象中,方便快捷。注意,addAll方法不会去重,如果添加的元素在当前ArrayList中已经存在,则会重复添加

 4.2subList方法

ArrayList中的subList方法用于获取原顺序表的一个子顺序表。它接受两个参数,分别是起始索引(fromindex)和结束索引(toindex),其左闭右开。一个新的List对象,包含原顺序表中指定范围内的元素。


subList方法返回的子顺序表在原顺序表的内部,对子顺序表的修改会反映到原顺序表上,反之亦然。这意味着,如果你修改了子顺序表中的元素,原顺序表也会相应地被修改;如果你修改了原顺序表中的元素,子顺序表也会相应地被修改。


需要注意的是,如果有一个顺序表此时存在一个子顺序表,现在将该顺序表结构性修改(如添加或删除元素),之后再用println打印子顺序表,会导致ConcurrentModificationException异常抛出。这是因为结构性修改改变了原顺序表的大小,从而也破坏了其子列表的大小,所以打印子列表时就报错。(内容牵涉到了迭代器,这里就不细讲)


ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);List<Integer> subList = list.subList(1, 4);
System.out.println(subList);  // 输出:[2, 3, 4]subList.set(0, 10);
System.out.println(list);  // 输出:[1, 10, 3, 4, 5]list.add(6);
System.out.println(subList);  // 抛出ConcurrentModificationException异常

4.3ArrayList的常用方法总使用 

 ❤️❤️以下是我们对常用方法的总使用,大家了解一下。

        ArrayList<Integer> arrayList = new ArrayList<>();// 1,插入(尾插)arrayList.add(1);arrayList.add(2);arrayList.add(3);arrayList.add(4);arrayList.add(5);System.out.println("插入数据后:" + arrayList);// 2,在任意位置插(下标)插入arrayList.add(0, -1);System.out.println("在0下标插入-1后:" + arrayList);// new 一个链表对象并尾插“1”,“2”LinkedList<Integer> linkedList = new LinkedList<>();linkedList.addLast(1);linkedList.addLast(2);// 3,插入 linklist 的所有元素arrayList.addAll(linkedList);System.out.println("插入linklist后:" + arrayList);// 4,删除任意位置(下标)数据arrayList.remove(0);System.out.println("删除0下标数据后:" + arrayList);// 5,删除指定数据arrayList.remove(new Integer(1));// 参数为Object(类)类型的对象System.out.println("删除第一个1后:" + arrayList);// 上面两个remove()方法构成了重载// remove()方法的参数如果输入整数之后不会自动装箱,而是会被自动识别为index。// 因为index是int类型,而顺序表中的数据是Object(类)类型// 但在插入数据时,输入的是1,基本类型,它会自动装箱,变成Integer类型//删除数据时之所以输入整数时不自动装箱是因为其参数本身就有index(整数)这个类型//所以优先选择该整型参数,不会自动装箱。// 所以要删除数据,应该输入类类型的对象,而不是基本类型的数据// 6,获取任意位置(下标)数据int ret = arrayList.get(0);System.out.println("得到0下标的数据:" + ret);// 7,更改任意位置(下标)数据arrayList.set(0,100);System.out.println("把0下标数据改成100后:" + arrayList);// 8,判断是否存在该数据boolean bl = arrayList.contains(100);System.out.println("判断是否存在100这个数据:" + bl);// 9,返回第一个key的位置(下标)int index = arrayList.indexOf(2);System.out.println("第一个2的下标:" + index);// 10,返回最后一个key的位置(下标)int lastIndex = arrayList.lastIndexOf(2);System.out.println("最后一个2的下标:" + lastIndex);// 11,获取顺序表长度int size = arrayList.size();System.out.println("顺序表长度为:" + size);// 12,截取List<Integer> list  = arrayList.subList(1, 3);// [1,3)左闭右开,返回出的子顺序表和ArrayList共用一个elementData数组System.out.println(list);// 13,清空顺序表arrayList.clear();System.out.println("清空顺序表后:" + arrayList);

5.ArrayList的遍历 

 ❤️❤️对于顺序表的遍历,我们可以通过 for 循环,for-each,以及迭代器的方法遍历:

public class TestArrayList {public static void main(String[] args) {ArrayList<Integer> arrayList = new ArrayList<>();arrayList.add(1);arrayList.add(2);arrayList.add(3);// 通过for循环遍历ArrayListfor (int i = 0; i < arrayList.size(); i++) {System.out.print(arrayList.get(i) + " ");}// 通过for-each循环遍历ArrayListfor (Integer integer : arrayList) {System.out.print(integer + " ");}// 通过迭代器遍历ArrayList(了解即可,无需深入了解,之后会学)Iterator<Integer> it = arrayList.iterator();while (it.hasNext()) {System.out.print(it.next() + " ");}}
}

除此以外,我们还可以通过println(ArrayList对象)打印出该对象内部的所有元素,这个方法我们在之前就讲过了,这里不多讲述了。

 6.总结

所以对于我们的顺序表的相关知识点就讲完啦,之后将给大家介绍链表,敬请期待! 还希望各位大佬们能给个三连,点点关注,点点赞,发发评论呀,感谢各位大佬~❤️❤️💕💕🥳🎉🎉🎉

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

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

相关文章

Spring IOC(一)

1. Spring IOC入门 1.1 什么是Spring IoC IoC&#xff08;Inversion of Control&#xff09;&#xff0c;即控制反转&#xff0c;是一种设计原则。简单来说&#xff0c;IoC就是将程序的某种传统控制流程反转了。 在Spring框架中&#xff0c;控制反转体现在对象的创建和管理上。…

jsp servlet 学生信息管理系统

一、角色划分 1、超级管理员 2、学生 二、模块展示 1、登录 2、列表页面【超级管理员展示所有用户信息、学生只展示当前登录用户信息】 3、新增 4、编辑 三、数据库【mysql】 四、运行演示 jsp servlet 学生信息管理系统

rust疑难杂症解决

rust疑难杂症解决 边碰到边记录&#xff0c;后续可能会逐步增加&#xff0c;备查 cargo build时碰到 Blocking waiting for file lock on package cache 原因是Cargo 无法获取对包缓存的文件锁&#xff0c; 有时vscode中项目比较多&#xff0c;如果其中某些库应用有问题&…

CSS 之 transition过渡动画

一、简介 ​ CSS 制作 Web 动画有两种方式&#xff1a; 帧动画&#xff08;Keyframe Animation&#xff09;和过渡动画&#xff08;Transition Animation&#xff09;。针对不同的业务场景中&#xff0c;我们应该选择不同的动画方式&#xff0c;通常来说&#xff1a;对于交互元…

vue3插槽的name和v-slot的研究

slot可以分为具名插槽和默认,默认插槽name是default 在父组件的template需要些v-slot/#,没写不生效,而在父组件下,而没被template包含的默认放在template且含有#default. 1)没写slot,可以不写template,也可写default的template2)写了name的slot,即使是default也必须些template…

STM32G431RBT6之LCD与LED配置

首先,配置时钟树,时钟树的配置在我的另外一篇博客里,这里不再赘述. LCD与LED具有共同的IO口,同时创建工程较好. 打开原理图,发现LED的IO口是PC8~PC15,还有一个容易看漏的PD2.LCD的IO口是PC0到PC15. 当然,看产品手册也可以知道,但是还是推荐大家看原理图. 打开cubumx,给PC0~PC…

Java设计模式 _结构型模式_过滤器模式

一、过滤器模式 1、过滤器模式 过滤器模式&#xff08;Filter Pattern&#xff09;是这一种结构型设计模式。过滤器&#xff0c;顾名思义&#xff0c;就是对一组数据进行过滤&#xff0c;从而最终获取到我们预期的数据。 2、实现思路 &#xff08;1&#xff09;、定义过滤器的…

想要应聘前端工程师——学习路线指南

前端工程师学习路线 按照前端岗位需求,以优先学习工作更需要,面试更常考的内容为原则,由浅入深,层层铺垫,与时俱进,可以较容易地总结出前端学习路线图: HTML / CSS / JavaScript 基础学习 《Web 入门》 MDN 权威入门指南,HTML / CSS / JavaScript 快速上手 《CSS 世界…

华为OD机试 - 密码解密(Java 2024 C卷 100分)

华为OD机试 2024C卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷C卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;每一题都有详细的答题思路、详细的代码注释、样例测试…

ChatGPT/GPT4 科研实战教程-包括论文写作、数据分析、科研绘图、PPT制作,程序开发

从2022年3月&#xff0c;OpenAI公司发布chatGPT3.5开始&#xff0c;以ChatGPT为代表的人工智能内容生成技术&#xff08;简称AIGC&#xff09;引起了广泛关注&#xff0c;我们进入了全民AI时代。 因此&#xff0c;我们需要了解和掌握AI思维&#xff0c;才能更好适应这个时代的…

uniapp微信小程序-分享

https://developers.weixin.qq.com/miniprogram/dev/component/button.html https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/share.html#%E4%BD%BF%E7%94%A8%E6%8C%87%E5%BC%95 参考未整理 自定义参考未整理

使用Canal实现MySQL主从同步

说明&#xff1a;本文介绍如何使用Canal实现MySQL主从同步的效果&#xff0c;关于Canal入门使用参考&#xff1a;Canal入门使用 启动Canal 首先&#xff0c;设置Canal服务器里&#xff0c;目标节点&#xff08;即监测的MySQL节点&#xff09;的配置&#xff0c;启动Canal服务…

Scala 03 —— Scala OOP Extension

Scala 2.1 —— Scala OOP Extension 一、正则 文章目录 Scala 2.1 —— Scala OOP Extension一、正则1.1 Java正则和Scala正则的区别1.2 Java正则和Scala正则的的基本知识点Java正则Scala正则 1.3 练习练习一&#xff1a;使用正则表达式解析日志方法一&#xff1a;使用findAl…

心理学上有个概念叫:习惯性反驳(附上解决办法)

在心理学上&#xff0c;有一个词&#xff0c;叫做习惯性反驳。 什么意思呢&#xff1f; 就是不管你说什么&#xff0c;他都要反驳你&#xff0c;最后把你带入负面的情绪黑洞&#xff0c;搞得你非常崩溃。 一个总是习惯性反驳的人&#xff0c;其实是非常可怕的。 习惯性反驳的3个…

与Apollo共创生态:Apollo7周年大会自动驾驶生态利剑出鞘

前言 4月22日&#xff0c;百度Apollo在北京车展前夕举办了以“破晓•拥抱智变时刻”为主题的智能汽车产品发布会&#xff0c;围绕汽车智能化&#xff0c;发布了智驾、智舱、智图等全新升级的“驾舱图”系列产品。 1、7周年大会 自2013年百度开始布局自动驾驶&#xff0c;201…

PotatoPie 4.0 实验教程(24) —— FPGA实现摄像头图像中心差分变换

为什么要对图像进行中心差分变换&#xff1f; 对图像进行中心差分变换的主要目的是计算图像中每个像素点的梯度。梯度在图像处理中是一个非常重要的概念&#xff0c;它可以用来描述图像中灰度变化的快慢和方向&#xff0c;常用于边缘检测、特征提取和图像增强等任务中。 具体…

windows服务启动提示‘服务没有响应控制功能’(mysql启动报错)

在安装mysql的时候&#xff0c;在windows服务项启动 或 使用命令net start mysql 时启动是报错&#xff0c;提示 服务没有响应控制功能 发生原因&#xff1a; Windows10 x64 或 更高的操作系统&#xff0c;有些系统缺少一些组件 解决办法&#xff1a; 1、下载最新的 Microsoft …

clickhouse安装部署

虚拟机&#xff1a;virtualbox7.0 操作系统&#xff1a;ubuntu server 22.04.3 虚拟机硬件&#xff1a;cpu 1&#xff0c;内存 2G&#xff0c; 硬盘 100G 采用默认安装 参照 https://clickhouse.com/docs/en/install#quick-install 安装部署 对于Debian、Ubuntu&#xff0c…

版本比对sql

弹窗 index <template><el-dialogtitle"版本":visible.sync"dialogVisible"width"55%"center:close-on-click-modal"false":close-on-press-escape"false":before-close"beforeClose"open"open&q…

【Linux网络】DHCP原理与配置

目录 一、DHCP工作原理 1.了解DHCP服务 2.使用DHCP的好处 3.DHCP的分配方式 二、DHCP的租约过程 三、DHCP场景应用实验 一、DHCP工作原理 1.了解DHCP服务 DHCP&#xff08;Dynamic Host Configuration Protocol&#xff0c;动态主机配置协议&#xff09; 由Internet工作…