java集合类-List/Queue

news2025/5/26 0:55:43

List
List集合代表一个元素有序、可重复的集合,集合中每个元素都有其对应的顺序索引。可以通过索引来访问指定位置的集合元素。List集合默认按元素的添加顺序设置元素的索引。
List接口(被改进)和ListIterator接口(被改进):
List作为Collection接口的子接口,可以使用Collection接口里的全部方法。而且由于List是有序集合,因此List集合里增加了一些根据索引来操作集合元素的方法。
1.void add(int index, Object element):将元素element插入到List集合的index处。
2.boolean addAll(int index, Collection c):将集合c所包含的所有元素都插入到List集合的index处。
3.Object get(int index):返回集合index索引处的元素。
4.int indexOf(Object o):返回对象o在List集合中第一次出现的位置索引。
5.int lastIndexOf(Object o):返回对象o在List集合中最后一次出现的位置索引。
6.Object remove(int index):删除并返回index索引处的元素。
7.Object set(int index, Object element):将index索引处的元素替换成element对象,返回被替换的旧元素。当调用List的set(int index,Object element)方法来改变List集合指定索引处的元素时,指定的索引必须是List集合的有效索引。例如集合长度是4,就不能指定替换索引为4处的元素—也就是说,set(int index,Object element)方法不会改变List集合的长度。
8.List subList(int fromIndex, int toIndex):返回从索引fromIndex(包含)到索引toIndex(不包含)处所有集合元素组成的子集合。
所有的List实现类都可以调用这些方法来操作集合元素。与Set集合相比,List增加了根据索引来插入、替换和删除集合元素的方法。除此之外,Java 8还为List接口添加了如下两个默认方法:
1.void replaceAll(UnaryOperator operator):根据operator指定的计算规则重新设置List集合的所有元素。
2.void sort(Comparator c):根据Comparator参数对List集合的元素排序。
其中UnaryOperator和Comparator 都是函数式接口,可以用lambda表达式代替:
在这里插入图片描述
List结合最大的特点就是 ----------有----------索引
List集合可以根据位置索引来访问集合中的元素,因此List增加了一种新的遍历集合元素的方法:使用普通的for循环来遍历集合元素。
而且还有一个问题。。。。。这货判断两个List对象相等。。。。。。只需要:通过equals()方法比较返回true即可。

List集合比Set集合多一个方法listIterator() :
Set只提供了一个iterator()方法,List不但有iterator()方法,还额外提供了listIterator() 方法,该方法返回一个ListIterator对象,ListIterator接口继承了Iterator接口,提供了专门操作List的方法。ListIterator接口在Iterator接口基础上增加了如下方法。
1.boolean hasPrevious():返回该迭代器关联的集合是否还有上一个元素。
2.Object previous():返回该迭代器的上一个元素。
3.void add(Object o):在指定位置插入一个元素。
ListIterator增加了向前迭代的功能(Iterator只能向后迭代),而且ListIterator还可通过add()方法向List集合中添加元素(Iterator只能删除元素)。
开始具体的List。。。。。ArrayList和Vector(废弃)
ArrayList和Vector作为List接口的两个典型实现,完全支持前面介绍的List接口的全部功能。ArrayList 和Vector类都是基于数组实现的List类,所以ArrayList和Vector类封装了一个动态的、允许再分配的Object[]数组。ArrayList或Vector对象使用initialCapacity参数来设置该数组的长度,当向ArrayList或Vector中添加元素超出了该数组的长度时,它们的initialCapacity会自动增加。
对于通常的编程场景,程序员无须关心ArrayList或Vector的initialCapacity。但如果向ArrayList或Vector集合中添加大量元素时,可使用ensureCapacity(int minCapacity)方法一次性地增加initialCapacity。这可以减少重分配的次数,从而提高性能。
如果开始就知道ArrayList或Vector集合需要保存多少个元素,这可以在创建时就指定initialCapacity的大小,如果创建空的ArrayList或Vector集合时不指定initialCapacity参数,则Object[]数组的长度默认为10。
除此之外,ArrayList和Vector还提供了如下两个方法来重新分配Object[]数组。
1.void ensureCapacity(int minCapacity) :将 ArrayList或Vector集合的Object[]数组长度增加大于或等于minCapacity值。
2.void trimToSize():调整ArrayList或Vector集合的Object[]数组长度为当前元素的个数。调用该方法可减少ArrayList或Vector集合对象占用的存储空间。
ArrayList和Vector在用法上几乎完全相同,但由于Vector是一个古老的集合(从JDK 1.0就有了),那时候Java还没有提供系统的集合框架,从JDK 1.2以后,Java提供了系统的集合框架,就将Vector改为实现List接口,作为List的实现之一,从而导致Vector里有一些功能重复的方法。
Vector的系列方法中方法名更短的方法属于后来新增的方法,方法名更长的方法则是Vector原有的方法。Java改写了Vector原有的方法,将其方法名缩短是为了简化编程。而ArrayList开始就作为List的 主要实现类,因此没有那些方法名很长的方法。实际上,Vector具有很多缺点,通常尽量少用Vector实现类。
ArrayList和Vector的显著区别是:
ArrayList是线程不安全的,当多个线程访问同一个ArrayList集合时,如果有超过一个线程修改了ArrayList集合,则程序必须手动保证该集合的同步性;但Vector集合则是线程安全的,无须程序保证该集合的同步性。因为Vector是线程安全的,所以Vector的性能比ArrayList的性能要低。实际上,即使需要保证List集合线程安全,也同样不推荐使用Vector实现类。Collections工具类可以将一个ArrayList变成线程安全的。
Vector还提供了一个Stack子类,它用于模拟“栈”这种数据结 构,“栈”通常是指“后进先出”(LIFO)的容器。最后“push”进 栈的元素,将最先被“pop”出栈。与Java中的其他集合一样,进栈出 栈的都是Object,因此从栈中取出元素后必须进行类型转换,除非你只是使用Object具有的操作。所以Stack类里提供了如下几个方法。
1.Object peek():返回“栈”的第一个元素,但并不将该元素“pop”出栈。
2.Object pop() : 返 回 “ 栈 ” 的 第 一 个 元 素 , 并 将 该 元 素“pop”出栈。
3.void push(Object item):将一个元素“push”进栈,最后一个进“栈”的元素总位于“栈”顶。
需要指出的是,由于Stack继承了Vector,因此它也是一个非常古老的Java集合类,它同样是线程安全的、性能较差的,因此应该尽量少用Stack类。如果程序需要使用“栈”这种数据结构,建议使用后面将要介绍的ArrayDeque代替它。

固定长度的List
操作数组的工具类:Arrays,该工具类里提供了asList(Object…a)方法,该方法可以把一个数组或指定个数的对象转换成一个List集合,这个List集合既不是ArrayList实现类的 实例也不是Vector实现类的实例,而是Arrays的内部类的ArrayList的实例。
Arrays.ArrayList是一个固定长度的List集合,程序只能遍历访问该集合里的元素,不可增加、删除该集合里的元素。

Queue集合
Queue用于模拟队列这种数据结构,队列通常是指“先进先出” (FIFO)的容器。队列的头部保存在队列中存放时间最长的元素,队列的尾部保存在队列中存放时间最短的元素。新元素插入(offer)到队列的尾部,访问元素(poll)操作会返回队列头部的元素。通常,队列不允许随机访问队列中的元素。Queue接口中定义了如下几个方法。
➢ void add(Object e):将指定元素加入此队列的尾部。
➢ Object element():获取队列头部的元素,但是不删除该元素。
➢ boolean offer(Object e):将指定元素加入此队列的尾部。 当使用有容量限制的队列时,此方法通常比add(Object e)方法更好。
➢ Object peek():获取队列头部的元素,但是不删除该元素。如果此队列为空,则返回null。
➢ Object poll():获取队列头部的元素,并删除该元素。如果此队列为空,则返回null。
➢ Object remove():获取队列头部的元素,并删除该元素。
Queue接口有一个PriorityQueue实现类。
PriorityQueue是一个比较标准的队列实现类。之所以说它是比较标准的队列实现,而不是绝对标准的队列实现,是因为PriorityQueue保存队列元素的顺序并不是按加入队列的顺序,而是按队列元素的大小进行重新排序。因此当调用peek()方法或者poll()方法取出队列中的元素时,并不是取出最先进入队列的元素,而是取出队列中最小的元素。从这个意义上来看,PriorityQueue已经违反了队列的最基本规则:先进先出(FIFO)。
PriorityQueue不允许插入null元素,它还需要对队列元素进行排序,PriorityQueue的元素有两种排序方式。
➢ 自然排序:采用自然顺序的PriorityQueue集合中的元素必须 实现了Comparable接口,而且应该是同一个类的多个实例,否则可能导致ClassCastException异常。
➢ 定制排序:创建PriorityQueue队列时,传入一个Comparator对象,该对象负责对队列中的所有元素进行排序。采用定制排序时不要求队列元素实现Comparable接口。PriorityQueue队列对元素的要求与TreeSet对元素的要求基本一致,不再赘述。

Queue还有一个Deque接口,Deque代表一个“双端队列”,双端队列可以同时从两端来添加、删除元素,因此Deque的实现类既可当成队列使用,也可当成栈使用。Java为Deque提供了ArrayDeque和LinkedList两个实现类。
Deque中有如下方法,后续自查API学习吧,仅供了解:
➢ void addFirst(Object e):将指定元素插入该双端队列的开头。
➢ void addLast(Object e):将指定元素插入该双端队列的末尾。
➢ Iterator descendingIterator():返回该双端队列对应的迭代器,该迭代器将以逆向顺序来迭代队列中的元素。
➢ Object getFirst():获取但不删除双端队列的第一个元素。
➢ Object getLast():获取但不删除双端队列的最后一个元素。
➢ boolean offerFirst(Object e):将指定元素插入该双端队列的开头。
➢ boolean offerLast(Object e):将指定元素插入该双端队列的末尾。
➢ Object peekFirst():获取但不删除该双端队列的第一个元素;如果此双端队列为空,则返回null。
➢ Object peekLast():获取但不删除该双端队列的最后一个元素;如果此双端队列为空,则返回null。
➢ Object pollFirst():获取并删除该双端队列的第一个元素;如果此双端队列为空,则返回null。
➢ Object pollLast():获取并删除该双端队列的最后一个元素;如果此双端队列为空,则返回null。
➢ Object pop()(栈方法):pop出该双端队列所表示的栈的栈顶元素。相当于removeFirst()。
➢ void push(Object e)(栈方法):将一个元素push进该双端队列所表示的栈的栈顶。相当于addFirst(e)。
➢ Object removeFirst():获取并删除该双端队列的第一个元素。
➢ Object removeFirstOccurrence(Object o):删除该双端队列的第一次出现的元素o。
➢ Object removeLast():获取并删除该双端队列的最后一个元素。
➢ boolean removeLastOccurrence(Object o):删除该双端队列的最后一次出现的元素o。
从上面方法中可以看出,Deque不仅可以当成双端队列使用,而且可以被当成栈来使用,因为该类里还包含了pop(出栈)、push(入栈)两个方法。
Deque接口提供了一个典型的实现类:ArrayDeque,从该名称就可以看出,它是一个基于数组实现的双端队列,创建Deque时同样可指定一个numElements参数,该参数用于指定Object[]数组的长度;如果不指定numElements参数,Deque底层数组的长度为16。
提示:
ArrayList和ArrayDeque两个集合类的实现机制基本相似,它们的底层都采用一个动态的、可重分配的Object[]数组来存储集合元素,当集合元素超出了该数组的容量时,系统会在底层重新分配一个Object[]数组来存储集合元素。

LinkedList实现类,同时实现了List接口和Deque接口。
LinkedList类是List接口的实现类,这意味着它是一个List集合,可以根据索引来随机访问集合中的元素。除此之外,LinkedList还实现了Deque接口,可以被当成双端队列来使用,因此既可以被当成栈使用,也能当成双端队列使用。
LinkedList与ArrayList 和ArrayDeque的实现机制完全不同。
ArrayList、ArrayDeque内部以数组的形式来保存集合中的元素,因此随机访问集合元素时有较好的性能;而LinkedList内部以链表的形式来保存集合中的元素,因此随机访问集合元素时性能较差,但在插入、删除元素时性能比较出色(只需改变指针所指的地址即可)。需要指出的是,虽然Vector也是以数组的形式来存储集合元素的,但因为它实现了线程同步功能(而且实现机制也不好),所以各方面性能都比较差。
注意:
对于所有的内部基于数组的集合实现,例如ArrayList、ArrayDeque等,使用随机访问的性能比使用Iterator迭代访问的性能要好,因为随机访问会被映射成对数组元素的访问。

再来比较下各种List集合的性能,即各种线性表的性能分析
List是一个线性表接口,其中ArrayList(基于数组)、LinkedList(基于链表)又是线性表的两种典型实现,其中LinkedList还提供了双端队列、栈的功能。
Queue代表了队列,Deque代表了双端队列(既可作为队列使用,也可作为栈使用)
一般来说,由于数组以一块连续内存区来保存所有的数组元素,所以数组在随机访问时性能最好,所有的内部以数组作为底层实现的集合在随机访问时性能都比较好;
而内部以链表作为底层实现的集合在执行插入、删除操作时有较好的性能。
但总体来说ArrayList的性能比LinkedList的性能要好,因此大部分应该考虑使用ArrayList。
规则如下:
1.如果需要遍历List集合元素,对于ArrayList、Vector集合, 应该使用随机访问方法(get)来遍历集合元素,这样性能更好;对于LinkedList集合,则应该采用迭代器(Iterator)来
遍历集合元素。
2.如果需要经常执行插入、删除操作来改变包含大量数据的List集合的大小,可考虑使用LinkedList集合。使用ArrayList、Vector集合可能需要经常重新分配内部数组的大小,效果可能较差。
3.如果有多个线程需要同时访问List集合中的元素,开发者可考虑使用Collections将集合包装成线程安全的集合。

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

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

相关文章

四六级英语学习(一)医疗健康类

suffer from 遭受 经历 high blood pressurehypertension 高血压 take steps to take measures to 采取措施 silent 沉默的 silence 沉默 -er表示人 或机器 eg: killer computer strokes 中风 attack 攻击,进攻 almostnearly 几乎 差不多 disease 大病 illn…

【uniapp】H5和小程序动态导入模块的方法

做uniapp项目通常都是用import Module from "./../module.js"方式引用模块的,但是,这种方式是静态的,还是只能放在执行代码段的顶部(或者外部),若想放在代码中执行,那就会报错的&…

微信小程序——生命周期,生命周期的分类,页面生命周期,生命周期函数的分类,应用的生命周期函数,页面的生命周期函数,wxs脚本概述

一.生命周期什么是生命周期生命周期( Life Cycle )是指一个对象从创建->运行->销毁的整个阶段,强调的是一个时间段。例如:.张三出生,表示这个人生命周期的开始.张三离世,表示这…

单源最短路的建图方式(Dijkstra)

由于是复习,所以不会解释太多。 主要为Dijkstra的堆优化板子和朴素版(看数据范围) 再次看看时间复杂度[ n 为点数,m 为边数 ]:朴素版:O(),堆优化版:O( (nm)logm )。 目录 1.热浪&…

CS专业学习回顾

前言 起因是想清理一下github的仓库,没错是清理,之前fork了很多仓库学习代码,还有自己随便上传的一些代码,因为感觉没有留着的必要,博客多少可以review,这些早期写的代码,如洪水猛兽&#xff0…

java集合类-操作集合

Collections(操作集合的工具类) 该工具类里提供了大量方法对集合元素进行排序、查询和修改等操作,还提供了将集合对象1.设置为不可变、对集合对象实现同步控制等方法。自行看API即可。 2.有查找、替换集合元素的类方法。 有同步控制的方法&am…

使用 Python 深度学习方法对电影评论进行情绪预测

情感分析是一种自然语言处理问题,可以理解文本并预测潜在意图。 在本文中,你将了解如何使用 Keras 深度学习库将电影评论的情绪预测为正面或负面。 看完这篇文章,你会知道: 关于自然语言处理的 IMDB 情感分析问题以及如何在 Ke…

核心表结构

核心表结构目录概述需求:参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,full busy,skip hardness,make a better result,wait for change,challenge Survive. happy for hardess to solve denp…

Android重新签名APK

前提已经配置好了Java环境。在要签名的apk文件目录路径位置,输入cmd,打开命令窗口。在命令窗口中输入jarsigner,有相应的提示。然后输入重新签名指令如下:jarsigner -verbose -keystore E:\tmc\keystore\androidsign.jks -signedj…

51单片机学习笔记-10IIC总线

10 I2C总线 [toc] 注:笔记主要参考B站江科大自化协教学视频“51单片机入门教程-2020版 程序全程纯手打 从零开始入门”。 10.1 AT24C02和I2C介绍 10.1.1 存储器介绍 图10-1 存储器分类 一般来说,RAM读写速度极快,但掉电丢失;而…

InfluxDB OSS v2.6.0安装使用小结(ubuntu Linux)

1 InfluxDB简介 InfluxDB是一款用Go语言编写的开源分布式时序、事件和指标数据库。 官网:https://www.influxdata.com 1.1 特色 InfluxDB的主要特色 1)无结构(无模式):可以是任意数量的列 2)可拓展的 3&…

学习云原生的阅读书单

以下是我从豆瓣阅读上找到的书单 《云原生服务网格lstio》 《云原生操作系统Kubernetes》 《OpenShift云原生架构:原理与实践》

[oeasy]python0066_控制序列_光标位置设置_ESC_逃逸字符_CSI

光标位置 回忆上次内容 上次讲了 三引号的输出三引号中 回车和引号 都会 被原样输出\ 还是需要从 \\转义 黑暗森林 快被摸排清了 还有哪个 转义序列 没 研究过吗?🤔 \e是 干什么的?🤔 回忆转义 转义转义 转化含义 \反斜杠(…

CnOpenData劳务外包企业工商注册基本信息数据

一、数据简介 随着我国社会主义市场经济的发展,劳务市场中的用工方式也朝着多样化方向演变,劳务外包正是现代化人力资源管理和企业生产实际结合的一种独特的新模式。 在劳务外包过程中,企业将人事管理的部分或者全部工作外包给一个专门的服务…

Hadoop 复习 ---- chapter01【大数据概念】

Hadoop 复习 ---- chapter01【大数据概念】1. 什么是大数据大数据的简介从IT过渡到DT2. Hadoop生态系统工具HADOOPHBASEHIVESTORMZooKeeperSqoopMAHOUT1. 什么是大数据 大数据的简介 指“无法由现有软件工具进行提取、存储、搜索、共享、分析和处理的庞大而复杂的数据集”。 通…

【软件测试】某城商行手机银行授权漏洞分析黑客攻击,测试优化手段......

目录:导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜)前言 问题描述 据报道&am…

【FreeRTOS】详细讲解FreeRTOS的软件定时器及通过示例讲述其用法

软件定时器 所谓定时器,也就可以类比生活中人们常用的闹钟,可以单次响铃提醒,也可以间隔固定时间响铃提醒;与FreeRTOS定时器不同的是周期不同,FreeRTOS的周期更加短,一般使用毫秒(ms)、秒(s)。   软件定时…

Python的数字类型、布尔类型和运算优先级

文章目录1.数字类型1.1分类1.2整数1.3浮点数1.4复数2.数字运算符2.1运算符表格2.2 运算符 //3.divmod()函数4.abs()函数4. int(),float() 和 complex() 函数5.pow()函数和运算符 **6.布尔类型6.…

NB-IoT的低功耗特性原理解说

什么是NB-IoT NB-IoT的中文名叫窄带蜂窝物联网(Narrow Band Internet of Things),NB-IoT网络是基于4G网络演进过来的,所以它在上行和下行的复用技术上还是沿用了4G的OFDMA和SC-FDMA。NB-IoT有三大特性:速率低,成本低,…

电脑风扇声音大怎么办?具体原因以及解决措施,快速解决

​很多小伙伴使用台式电脑,使用的时间长了,电脑机箱里的风扇就会发出一些噪音,很影响小伙伴的整体使用体验。电脑风扇声音大怎么办?具体的原因以及解决措施有哪些?下面就跟着小编一起来看看吧。 一、电脑风扇声音大的原…