Collection接口详细介绍(上)

news2024/11/20 18:35:40

前言:
本篇文章主要讲解Java中的Collection接口以及相关实现类的知识。该专栏比较适合刚入坑Java的小白以及准备秋招的大佬阅读。

如果文章有什么需要改进的地方欢迎大佬提出,对大佬有帮助希望可以支持下哦~

小威在此先感谢各位小伙伴儿了😁

在这里插入图片描述

以下正文开始

文章目录

  • Collection接口介绍
  • List接口详细介绍
  • ArrayList实现类
  • LinkedList实现类
  • 图书推荐

在这里插入图片描述

Collection接口介绍

Java中的集合按照存储结构可以分为两大类,单列集合Collection和双列集合Map,本文将先讲解单列集合Collection的相关知识点。

Java中的Collection集合接口是一个用于存储、处理和操作对象的容器,,它有三个主要的子接口,分别是List、Set和Queue

  1. List:List接口是一个有序集合,允许重复元素。它继承了Collection接口并添加了一些额外的方法,如get(int index)、set(int index, E element)等。常见实现类包括ArrayList和LinkedList。

  2. Set:Set接口是一个不允许重复元素的集合,保证其内部元素唯一性。它也继承自Collection接口,并且添加了一些特殊的限制条件来保证元素的唯一性。常见实现类包括HashSet和TreeSet。

  3. Queue:Queue接口是一个队列集合,通常按照先进先出(FIFO)原则进行操作。它继承自Collection接口并添加了一些额外的方法,如offer(E e)、poll()等。 常见实现类包括ArrayDeque和PriorityQueue。

接着先列举下Collection接口中的常用方法:

add(E e):向集合中添加一个元素。
addAll(Collection<? extends E> c):向集合中添加一个集合中的所有元素。 clear():清空集合中的所有元素。 contains(Object o):判断集合中是否包含指定元素。 containsAll(Collection<?> c):判断集合中是否包含指定集合中的所有元素。
equals(Object o):比较两个集合是否相等。
hashCode():返回集合的哈希值。
isEmpty():判断集合是否为空。
iterator():返回一个迭代器,用于遍历集合中的元素。
remove(Object o):从集合中移除指定元素。
removeAll(Collection<?> c):从集合中移除指定集合中的所有元素。 retainAll(Collection<?> c):保留集合中指定集合中的所有元素。
size():返回集合中元素的数量。
toArray():将集合转换为数组。
toArray(T[] a):将集合转换为指定类型的数组。

以上是Collection接口中的常用方法,我们开发者会用即可。
在这里插入图片描述

List接口详细介绍

List是Java集合框架中的一种特殊集合,它代表了一组有序的元素集合,允许重复元素的存在,并且每个元素可以根据索引值来进行访问。List接口派生自Collection接口,因此,它继承了Collection接口中的所有方法,同时也提供了一些额外的方法,来支持处理元素的位置和顺序,以下是其方法:

void add(int index, E element):在指定索引位置插入一个元素。
boolean addAll(Collection<? extends E> c):将另一个集合中的所有元素添加到该列表中,添加的顺序与原集合相同。 boolean contains(Object o):如果列表包含指定元素,则返回true。 E get(int index):返回列表中指定索引位置的元素。 int indexOf(Object o):返回列表中第一次出现指定元素的索引,如果列表不包含该元素,则返回-1。 boolean isEmpty():如果列表不包含任何元素,则返回true。 Iterator iterator():返回一个迭代器,可以用于遍历列表中的所有元素。 E remove(int index):删除列表中指定索引位置的元素。 boolean removeAll(Collection<?> c):从列表中删除指定集合中包含的所有元素。
boolean retainAll(Collection<?> c):仅在列表中保留指定集合中包含的元素。
int size():返回列表中的元素数。
List subList(int fromIndex, int toIndex):返回列表中指定范围内的部分元素(fromIndex到toIndex)。
Object[] toArray():将列表转换成一个数组。

其中,List的主要实现类就有ArrayList和LinkedList,这两个类在使用时有着很大的区别,接下来将详细介绍下这两个类。

ArrayList实现类

ArrayList是Java集合框架中的一个类,实现了List接口。它是一种基于动态数组实现的可变长度序列

在这里插入图片描述

ArrayList的主要特点主要有哪些呢,请接着看:

  • 长度可变:ArrayList在创建时可以指定初始容量,但其大小并不固定,可以根据需要动态扩展或缩小。这使得ArrayList非常适合存储元素数量不确定的数据。

  • 允许重复元素:和List接口一样,ArrayList也允许包含重复元素。

  • 索引操作高效:由于ArrayList底层使用数组实现,因此对于索引操作(例如get、set)非常快速。时间复杂度为O(1)

  • 插入/删除低效:由于在任意位置插入或删除元素可能导致后续元素的移动,因此这些操作较慢。具体来说,在最坏情况下,插入/删除一个元素需要将后面所有元素向右/左移动,时间复杂度为O(n)。

  • 不支持原始类型:由于泛型机制的限制,ArrayList不支持原始类型(例如int、double等),只能存储对象类型。如果需要存储原始类型,则需要使用对应的包装类(如Integer、Double等)。

  • 线程不安全:ArrayList是线程不安全的,在多线程环境下需要手动进行同步操作,或者使用线程安全的替代类(如Vector、CopyOnWriteArrayList等)。

使用ArrayList时需要注意:

  1. 容量的初始化:可以通过指定初始容量来避免不必要的扩容操作,从而提高效率。通常情况下,可以根据实际数据量的大小来初始化容量。

  2. 局部变量:为了减少垃圾回收的次数和时间,应该尽可能将ArrayList定义为局部变量,而不是作为类成员变量。

  3. 使用简化版循环:在遍历ArrayList时,可以使用简化版循环(foreach),这样更加简单直观。

  4. 线程安全:如果需要在多线程环境下使用ArrayList,可以考虑使用线程安全的实现类,如使用Collections.synchronizedList()方法将ArrayList转换成线程安全的列表。

ArrayList是基于数组实现的,因此创建ArrayList时需要指定其初始容量。在创建ArrayList时,可以通过无参构造函数来创建一个默认大小为10的ArrayList,也可以通过有参构造函数来创建指定大小的ArrayList。

关于ArrayList的扩容机制,下面以案例详细介绍下:

我们在下面代码中创建了一个大小为20的ArrayList:

ArrayList<String> list = new ArrayList<String>(20);

在创建ArrayList时,如果不指定初始容量,则ArrayList的默认大小为10。当向ArrayList中添加元素时,如果实际存储的元素个数超过了ArrayList当前的容量,则ArrayList会自动进行扩容操作。具体扩容操作的细节如下:

  • 当需要扩容时,ArrayList会创建一个新的更大的数组,并将原来数组中的元素复制到新数组中。

  • 新数组的大小通常是原数组的1.5倍

  • 扩容后,ArrayList内部维护的数组大小和元素个数会自动更新。

在这里插入图片描述

LinkedList实现类

LinkedList是Java集合框架中的一个类,实现了List接口和Deque(双端队列)接口。它是一种基于链表实现的可变长度序列。
在这里插入图片描述

下面我们介绍一些LinkedList的主要特点:

  1. 长度可变:和ArrayList一样,LinkedList也可以动态扩展或缩小,适用于元素数量不确定的场景。

  2. 允许重复元素:和List接口一样,LinkedList也允许包含重复元素

  3. 索引操作低效:由于LinkedList底层使用链表实现,在进行索引操作时需要遍历链表,因此较慢。时间复杂度为O(n)

  4. 插入/删除高效:由于在任意位置插入或删除元素只需要修改相邻节点的指针,因此这些操作较快。具体来说,在最坏情况下,插入/删除一个元素需要遍历n/2个节点,时间复杂度为O(n)。

  5. 支持栈和队列操作:由于实现了Deque接口,因此LinkedList支持栈和队列等数据结构的操作。例如push/pop、offer/poll等方法。

  6. 不支持随机访问:由于索引操作较慢,在进行随机访问时不如ArrayList效率高。如果需要频繁进行随机访问,则应该选择ArrayList

  7. 线程不安全:和ArrayList一样,LinkedList是线程不安全的,在多线程环境下需要手动进行同步操作,或者使用线程安全的替代类(如ConcurrentLinkedDeque等)。

综上所述,LinkedList适用于频繁进行插入/删除操作且对于随机访问要求不高的场景。在这种情况下,使用LinkedList可以获得更好的性能。如果需要频繁进行索引操作,则应该选择ArrayList。

图书推荐

从Flask基础到Flask进阶,再到企业级论坛项目实战以及WebSocket在线聊天系统实战,囊括真实工作场景中绝大部分技术要点。
在这里插入图片描述

京东购买链接:点我购买

618,清华社 IT BOOK 多得图书活动开始啦!活动时间为 2023 年 6 月 7 日至 6 月 18 日,清华
社为您精选多款高分好书,涵盖了 C++、Java、Python、前端、后端、数据库、算法与机器学习等多 个 IT
开发领域,适合不同层次的读者。全场 5 折,扫码领券更有优惠哦!快来京东点击链接 IT BOOK
查看详情吧!

在这里插入图片描述

粉丝福利:点赞收藏文章,关注博主,任意评论(最多五条),即可参与抽奖。

获奖的欧皇可以49本书中任选一本!!!

文章到这里就先结束了,感兴趣的可以订阅专栏哈,后续会继续分享相关的知识点。

在这里插入图片描述

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

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

相关文章

利用神经网络重建三维数字孪生

利用神经网络重建三维数字孪生 从点云重建光滑表面是创建真实世界对象和场景的数字孪生的基本步骤。 表面重建算法出现在各种应用中&#xff0c;例如工业模拟、视频游戏开发、建筑设计、医学成像和机器人技术。 神经核表面重建 (NKSR) 是新的 NVIDIA 算法&#xff0c;用于从大…

Java学习路线一条龙

作者 | 磊哥 来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09; 转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09; Java 要掌握的技术点如下&#xff1a; JavaSE&#xff08;Java Standard Edition&#xff0c;Java 基础&#xff09;计算…

常用命令之Proxmox qm命令

一、Proxmox简介 Proxmox是一款基于Debian Linux的开源虚拟化平台&#xff0c;它允许用户在单个物理主机上运行多个虚拟机&#xff0c;并提供了许多高级功能&#xff0c;如高可用性、备份和恢复、集群管理等。Proxmox支持多种虚拟化技术&#xff0c;包括KVM和LXC&#xff0c;而…

【RISC_V课程笔记】导论

目标 完成以cpu的设计&#xff0c;三级流水线结构。取指(if), 译码(id), 执行(ex)cpu中断系统的设计以cpu为核心的SOC设计&#xff0c;完成rom,ram,time的外设的设计用uvm对cpu进行验证(system verilog) 理论 数字逻辑电路 数字信号&#xff1a;用二进制表示的信号&#xf…

一起看 I/O | 隆重推出 AI 驱动的编码助手 Studio Bot

作者 / Android Studio 高级产品经理 Adarsh Fernando 我们在 2013 年 Google I/O 大会上首次宣布推出 Android Studio&#xff0c;并承诺为 Android 应用开发者提供一流的集成开发环境 (IDE)。10 年后的今天&#xff0c;我们对提高开发者工作效率的承诺仍然推动着团队开发新的…

深入理解深度学习——注意力机制(Attention Mechanism):多头注意力(Multi-head Attention)

分类目录&#xff1a;《深入理解深度学习》总目录 相关文章&#xff1a; 注意力机制&#xff08;AttentionMechanism&#xff09;&#xff1a;基础知识 注意力机制&#xff08;AttentionMechanism&#xff09;&#xff1a;注意力汇聚与Nadaraya-Watson核回归 注意力机制&#…

【LeetCode热题100】打卡第20天:合并区间不同路径

文章目录 【LeetCode热题100】打卡第20天&#xff1a;合并区间&不同路径⛅前言 合并区间&#x1f512;题目&#x1f511;题解 不同路径&#x1f512;题目&#x1f511;题解 【LeetCode热题100】打卡第20天&#xff1a;合并区间&不同路径 ⛅前言 大家好&#xff0c;我是…

MySQL中的行级锁

行级锁的类型主要有三类&#xff1a; Record Lock&#xff0c;记录锁&#xff0c;也就是仅仅把一条记录锁上&#xff1b;Gap Lock&#xff0c;间隙锁&#xff0c;锁定一个范围&#xff0c;但是不包含记录本身&#xff0c;只存在于可重复读隔离级别&#xff0c;目的是为了解决可…

前端封装一个移动端(已支持PC)滚动的组件

安装 npm install better-scroll/core --save引入 import BScroll from better-scroll/core直接上代码 Scroll.vue <template><div ref"rootRef"><slot></slot></div> </template><script> import useScroll from ./u…

配置虚拟机(VMware )网络

1、查询 IP ip addr # 命令和ifconfig类似&#xff0c;但前者功能更强大&#xff0c;并旨在取代后者。可以看到两个网卡 lo和ens33&#xff08;lo是本地网卡&#xff09; 2、配置静态IP地址和修改主机名(网络配置使用随机分配免配置) 使用vi编辑器打开ens33网络的配置文件&am…

Windows系统配置Python环境(Anaconda篇)

Windows系统配置Python环境&#xff08;Anaconda篇&#xff09; 一、下载 根据自己电脑系统下载对应的安装包 官方下载地址&#xff1a;https://www.anaconda.com/products/distribution 清华镜像网站&#xff1a;https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/ …

SpringBoot——动态数据源(多数据源自动切换)

前言 日常的业务开发项目中只会配置一套数据源&#xff0c;如果需要获取其他系统的数据往往是通过调用接口&#xff0c; 或者是通过第三方工具比如kettle将数据同步到自己的数据库中进行访问。 但是也会有需要在项目中引用多数据源的场景。比如如下场景&#xff1a; 自研数据…

更有效的协同程序【插件:More Effective Coroutines】

插件地址&#xff1a;传送门 1、命名空间 using System.Collections.Generic; using MEC; 2、与传统的协程相比 传统&#xff1a;StartCoroutine(_CheckForWin()); 被RunCoroutine取代。必须选择执行循环进程&#xff0c;默认为“Segment.Update”。 using System.Coll…

华为OD机试真题 JavaScript 实现【最优资源分配】【2023Q1 200分】

一、题目描述 某块业务芯片最小容量单位为 1.25G&#xff0c;总容量为 M*1.25G&#xff0c;对该芯片资源编号为 1&#xff0c;2&#xff0c;… M。 该芯片支持 3 种不同的配置&#xff0c;分别为 A、B、C. 配置 A: 占用容量为 1.25 * 1 1.25G配置 B: 占用容量为 1.25* 2 2…

一文了解智能驾驶架构平台ROS2和自适应AUTOSAR之间的区别

公众号致力于点云处理&#xff0c;SLAM&#xff0c;三维视觉&#xff0c;高精地图等领域相关内容的干货分享&#xff0c;欢迎各位加入&#xff0c;有兴趣的可联系dianyunpcl163.com。未经作者允许请勿转载&#xff0c;欢迎各位同学积极分享和交流。 背景介绍 在汽车行业&#x…

有人问高考能改变命运不,老大爷回答是不能

昨天看到一段小视频&#xff0c;问高考能改变命运不&#xff0c;老大爷回答是不能。 我遂想起写写这个话题。 &#xff08;1&#xff09; 成功者的要素到底是什么&#xff1f; 我们中国人经常用&#xff1a;成者为王败者为寇&#xff0c;这句话来形容成功者。 我们见过很多成功…

警惕超声波工艺对晶振造成损伤

超声波技术被广泛应用于工业生产中&#xff0c;常见的超声波工艺有&#xff1a;超声波清洗工艺、焊接工艺。 使用该两种工艺时&#xff0c;超声波仪器通常以20KHz至60KHz的频率运行。 清洗工艺是指清除工件表面上液体或固体的污染物&#xff1b;而焊接工艺中&#xff0c;高频机…

论不同阶段的教育”焦虑“

有了孩子&#xff0c;父母们大体对其教育都会有点焦虑感。焦虑是一种情绪&#xff0c;但这里不分析情绪&#xff0c;而是在文题中加了引号&#xff0c;拆开来讨论下不同阶段教育的焦点与考虑。 学前 教育的焦虑在上小学前就开始了&#xff0c;担心起跑线落后了。德国和美国都做…

直播回顾|走进元服务,携手小强停车探索鸿蒙新流量阵地

本期直播《“元”来如此&#xff0c;“服务”直达——揭秘鸿蒙新流量阵地》聚焦元服务的商业流量价值&#xff0c;介绍元服务提供的服务直达和卡片动态变化等轻量化服务。网约停车旗舰平台小强停车做客直播间&#xff0c;分享小强停车在HarmonyOS生态中&#xff0c;如何通过元服…

数据库信息速递 SQL Server新版本许可证价格上涨了10%

开头还是介绍一下群&#xff0c;如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请联系 liuaustin3 &#xff0c;在新加的朋友会分到2群&#xff08;共…