百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT知识 > 正文

能懂系列之 List 集合详解

liuian 2025-01-14 15:19 70 浏览



今天咱们来谈一谈 java 的 list 集合吧,进入正题之前呢,咱们聊点题外话吧。前几天在工作中使用到了 map 的嵌套,也就是一个 map 的 value 是另一个 map, 这个由于是第一次接触呢,所以当时这个逻辑还是比较混乱的,因为不知道如果改了外层的 map , 内层的 value 会不会随之改变,后来做了好几个实例才发现不会,因为外层 map 的 key 所对应的 value 值都是和 key 绑定的,所以其实和一般的 map 的逻辑是一样的,这个等我之后有空的话再详细讲一讲吧。

好了,言归正传吧,下面正式进去今天的主题 --- List

那么,问题来了,什么是 list 呢,list 的特性和使用方法种种的又是什么呢,接下来就让我一点一点的来说吧。

List 是什么?

首先,咱们来说说什么是 List 吧!

集合类是 Java 数据结构的实现。Java 的集合类是 java.util 包中的重要内容,它允许以各种方式将元素分组,并定义了各种使这些元素更容易操作的方法。Java 集合类是 Java 将一些基本的和使用频率极高的基础类进行封装和增强后再以一个类的形式提供。集合类是可以往里面保存多个对象的类,存放的是对象,不同的集合类有不同的功能和特点,适合不同的场合,用以解决一些实际问题。

以上,是百度百科对于 List 集合的说明。通俗地讲 List 就是一个存放数据的容器,他根据你存储的顺序来给对应的索引值,而索引呢,也是你用来取出值的一个标识。

List 的继承结构

List 的继承结构

上面那张图没有过多的花里胡哨,可以让我们很清晰的看出集合的一个大概的继承体系,然而我们今天只看 Collection 下的 list 接口以及其实现类,因为我们今儿就是研究它来了。

特有功能

List 集合是一个元素有序(每个元素都有对应的顺序索引,第一个元素索引为 0)、且可重复的集合。

List 是 Collection 接口的子接口,故而拥有 Collection 的所有方法。除此之外呢,还有一些对索引操作的方法。

今天我们主要说的还是 List 的实现类,毕竟它很常用。

List 整体

从上图,可以让我们对于 List 的三个实现类有一个大概的了解.

分类

1、ArrayList

ArrayList 是一个数组队列,相当于 「动态数组」。与 Java 中的数组相比,它的容量能动态增长。它继承于 AbstractList,实现了 List, RandomAccess(随机访问), Cloneable(克隆), java.io.Serializable(可序列化)这些接口.

ArrayList 继承了 AbstractList,实现了 List。它是一个数组队列,提供了相关的添加、删除、修改、遍历等功能.

ArrayList 实现了 RandmoAccess 接口,即提供了随机访问功能。RandmoAccess 是 java 中用来被 List 实现,为 List 提供快速访问功能的。在 ArrayList 中,我们即可以通过元素的序号快速获取元素对象;这就是快速随机访问.

ArrayList 实现了 Cloneable 接口,即覆盖了函数 clone (),能被克隆。ArrayList 实现 java.io.Serializable 接口,这意味着 ArrayList 支持序列化,能通过序列化去传输.

ArrayList 的底层数据结构因为是数组,故而查询快,增删慢,线程不安全,效率高,可以存储重复元素。下面来看看 ArrayList 常用的一些方法吧。

1.1、add 方法:

向集合中插入数据,集合的索引下标是从 0 开始.

1.2、插入数据

向指定位置插入数据,两个参数,一个是索引,一个是数据,插入后这个索引后面的数据向后顺延.

1.3、删除数据

删除集合中的数据,参数是数据对应的索引值.

1.4、返回索引值.

指定元素再 list 集合中的位置,返回索引值.

1.5、set

替换 List 中对应位置的值,两个参数分别是索引及新的数据,此操作的返回值是被替换的数据.

1.6、get

返回指定索引的数据

1.7、addAll

新增集合操作,两个参数:插入的位置索引,插入的集合

1.8、lastIndexOf

返回元素最后一次出现的位置索引

1.9、subList

截取指定位置的数据,两个参数:开始位置的索引,结束位置的索引

上面所有代码的运行结果如下图:

好了,相信讲完这些大家会对 ArrayList 的使用有了一些比较具体的了解了。

不过厚此薄彼不好,下面我们来说说 List 的另外两个实现类吧,不过主要就是说一下它们和 ArrayList 的一个区别及它们本身的优势吧.

2、LinkedList

LinkedList 可以看做为一个双向链表,所有的操作都可以认为是一个双向链表的操作,因为它实现了 Deque 接口和 List 接口。同样,LinkedList 也是线程不安全的,如果在并发环境下使用它,同样用 Colletions 类中的静态方法 synchronizedList () 对 LinkedList 进行调用即可. LinkedList 与 ArrayList 最大的区别是 LinkedList 更加灵活,并且部分方法的效率比 ArrayList 对应方法的效率要高很多,对于数据频繁出入的情况下,并且要求操作要足够灵活,建议使用 LinkedList;对于数组变动不大,主要是用来查询的情况下,可以使用 ArrayList。

LinkedList 常用方法:

  • toArray (): 以正确的顺序(从第一个到最后一个)返回一个包含此列表中所有元素的数组
  • size (): 返回此列表中的元素数
  • set (int index,E element): 用指定的元素替换此列表中指定位置的元素
  • removeLast (): 从此列表中删除并返回最后一个元素
  • removeFirst (): 从此列表中删除并返回第一个元素
  • remove (int index): 删除该列表中指定位置的元素
  • getFirst (): 返回此列表中的第一个元素
  • getLast (): 返回此列表中的最后一个元素
  • get (int index): 返回此列表中指定位置的元素
  • add (E element): 将指定的元素追加到此列表的末尾
  • add (int index,E element): 在此列表中的指定位置插入指定的元素
  • addFirst (E element): 在该列表开头插入指定的元素
  • addLast (E element) : 将指定的元素追加到此列表的末尾
  • clear (): 从列表中删除所有元素

3、Vector

Vector 也是一个类似于 ArrayList 的可变长度的数组类型,它的内部也是使用数组来存放数据对象的。值得注意的是 Vector 与 ArrayList 唯一的区别是,Vector 是线程安全的,即它的大部分方法都包含有关键字 synchronized. 因此,若对于单一线程的应用来说,最好使用 ArrayList 代替 Vector,因为这样效率会快很多(类似的情况有 StringBuffer 与 StringBuilder);而在多线程程序中,为了保证数据的同步和一致性,可以使用 Vector 代替 ArrayList 实现同样的功能.「Vector 常用方法:」

  • add (E element): 将指定的元素追加到此 Vector 的末尾
  • add (int index,E element):在此 Vector 中的指定位置插入指定的元素
  • elementAt (int index): 返回指定索引处的组件
  • get (int index): 返回此向量中指定位置的元素
  • removeElementAt (int index): 删除指定索引处的组件
  • removeRange (int fromIndex,int toIndex):从此列表中删除所有索引为 fromIndex (含)和 toIndex 之间的元素

上面大体说了说 List 集合中另外两种实现类的一些基本详情,最后,既然是一系列的数据,那么必然会面临一个遍历的问题,所有本文的最后我们来看一看 List 的遍历方式 (其实只是 ArrayList 的遍历方式).

3.1、通过迭代器遍历。即通过 Iterator 去遍历.

List<String> list = new ArrayList();
        list.add(new String("book001"));
        list.add(new String("book002"));
        list.add(new String("book003 "));
        String value = null;
        Iterator iter = list.iterator();
        while (iter.hasNext()) {
            value = (String)iter.next();
            System.out.println(value);
        }

结果展示:

3.2、随机访问 index, 通过索引值去遍历.

由于 ArrayList 实现了 RandomAccess 接口,它支持通过索引值去随机访问元素.

List<String> list = new ArrayList();
        list.add(new String("book004"));
        list.add(new String("book005"));
        list.add(new String("book006 "));
        String value = null;
        int size = list.size();
        for (int i=0; i<size; i++) {
            value = (String)list.get(i);
            System.out.println(value);
        }

结果展示:

3.3、增强 for (foreach) 循环遍历

List<String> list = new ArrayList();
        list.add(new String("book007"));
        list.add(new String("book008"));
        list.add(new String("book009"));
        String value = null;
        for (String books:list) {
            value = books;
            System.out.println(value);
        }

结果展示:

小结

List 中元素是有序的,元素可以重复,因为该集合体有索引

ArrayList:

  • 底层数据结构是数组,查询快,增删慢。
  • 线程不安全,效率高。
  • 当元素放满了后,默认以原长度的 50%+1 的长度加长集合容器的长度。

LinkedList:

  • 底层数据结构是链表,查询慢,增删快。
  • 线程不安全,效率高。
  • Vector (线程安全的) 相对 ArrayList 查询慢
  • Vector 相对 LinkedList 增删慢 (数组结构)

Vector:

  • 底层数据结构是数组,查询快,增删慢。
  • 线程安全,效率低。
  • 当元素放满了后,默认以原长度 100% 的长度加长集合容器的长度

好啦,今天的关于 list 集合的一些知识就讲解结束啦,有什么错误或不足欢迎大家留言指正,程序员的路上并肩前行吧。

作者丨阿淼

来源丨微信公众号:Java学习之道

相关推荐

gho文件安装win10系统方法(gho文件怎么重装系统)

不建议这么操作,如果真的要复制,也是很麻烦的,首先要删除win10里面所有的驱动,注意是所有的,然后关机,注意不能重启进入系统,否则又要重新再来,其次找个U盘pe启动盘或者启动光盘,在开机进入pe系统...

下载163免费邮箱(免费下载网易邮箱163)

第一步:首先,我们手机里要有一个浏览器,小编比较用UC浏览器,当然可以用手机都是自带网页浏览器的,我这边的手机下载网易邮箱第二步:打开UC浏览器或者带浏览器,我们在地址栏上直接输入最新网易邮箱下载安装...

windows microsoft(windows microsoft store加载不出)

电脑开机时出现MicrosoftWindows遇到意外错误,可以尝试用最后一次正确配置来恢复一下。1、重启电脑。2、在电脑显示完硬件信息之后,进入windows界面之前,按F8键。3、在出现的选项菜单...

不读u盘的解决办法(不读u盘怎么回事)

u盘在电脑里读不出来,出现这种情况,可以用以下方法解决:1、判断U盘是否已经正确插入USB接口,你可以拔下来换个插口试试。2、如果已经启用了USB设备但运行不正常,解决办法为在设备管理器中删除“通用...

win11怎么激活(win11怎么激活office)

目前,Windows11的永久激活方法还没有被公开或者确认。不过,你可以尝试以下几种方法来激活Windows11:使用数字许可证:如果你的电脑已经安装了Windows10并且已经激活,那么你可以...

笔记本电脑快捷键大全(笔记本电脑快捷键大全常用)
  • 笔记本电脑快捷键大全(笔记本电脑快捷键大全常用)
  • 笔记本电脑快捷键大全(笔记本电脑快捷键大全常用)
  • 笔记本电脑快捷键大全(笔记本电脑快捷键大全常用)
  • 笔记本电脑快捷键大全(笔记本电脑快捷键大全常用)
苹果恢复出厂设置(苹果恢复出厂设置还能恢复数据吗)

首先打开手机上面的“设置”功能,进入手机的系统设置。进入手机的设置后,选择“通用"。进入通用之后,往下滑动页面,在页面的最下方可以看到“还原”的选项,点击进入。进入还原之后,有多个还原选项,我...

路由器的配置步骤(路由器配置教学)

打开浏览器-输入192.168.1.1(一般路由器地址是这个或者查看路由器背面的登录信息)进路由-输入用户名,密码,(默认一般是admin)。2、在【设置向导】里,选择【PPOE拨号】(有些是ADS...

psp模拟器ios(psp模拟器ios推荐)

psp手机模拟器推荐PPSSPP,作为最流行的开源PSP模拟器,因为其强大的功能和兼容性广受玩家们喜爱。虽然提供了PC和安卓双平台的支持,但是有碍于安卓设备的硬件,移动端PPSSPP的功能并不完整。不...

台式机重装系统按f几(重装电脑系统按f几)

F8、F9、F10、F11、F12、F2、del。一般用到这几个。下面以联想电脑装WIN10系统为例:1、将制作好的U盘插入要重装系统的电脑,开机画面出现电脑品牌logo时,不停地按“f2键”进入“B...

win10激活错误代码0x8007007b

Win10激活出现0x8007007b解决方法如下1、找到计算机,右键点击属性,确认你的电脑系统是否是windows10。2、鼠标右击桌面,依次点击个性化-主题-桌面图标设置,勾选计算机后依次点击应用...

4000台式电脑最好的组装配置
4000台式电脑最好的组装配置

四千元价格组装电脑主机与五千元组装电脑主机的价格类似,因为电脑主机就几个大部件,电脑主机主板是多少代的产品?主板内存的插槽数?电脑处理器等如果是自己组装,都可以配置到十二代产品,电脑硬盘可以分为256G固态硬盘做系统盘,1T机械硬盘作为工作...

2025-11-06 20:05 liuian

linux是一种什么系统(linux属于什么系统)

Linux,全称GNU/Linux,是一种免费使用和自由传播的类UNIX操作系统,是一个基于POSIX的多用户、多任务、支持多线程和多CPU的操作系统。其内核由林纳斯·本纳第克特·托瓦兹于1991年1...

手机管理大师免费版(手机管理大师极速版)

使用手机“文件管理”打开文件夹时提示访问受限,需要前往“文件”应用查看1.进入手机设置——安全——应用权限——权限/应用2.在手机桌面找到手机管家——权限隐私——应用权限——权限/应用?当然,相对于被...

电脑能开机但是进不去桌面怎么办

打开任务管理器按Ctrl+Shift+Esc打开任务管理器。文件中运行新任务点击文件,运行新任务。输入指令重启桌面输入explorer.exe,点击确定,等待桌面重启完成就可以了。电脑已经是我们生活中...