Collection接口详细介绍(上)

前言:
本篇文章主要讲解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.xdnf.cn/news/14.html

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

相关文章

电子蜡烛灯单片机开发方案

LED蜡烛灯可以像真正的蜡烛一样发出舒适的闪烁光&#xff0c;具有仿真蜡烛效果&#xff0c;适合在一些聚会或庆祝活动中使用。宇凡微推出的低成本LED蜡烛灯IC方案&#xff0c;根据不同电子蜡烛灯方案&#xff0c;主控芯片推荐使用YF单片机。 LED蜡烛灯是有孩子的家庭很好蜡烛替…

Vue单文件组件

单文件组件 单文件组件是在开发中用的比较多的&#xff0c;它的后缀都是.vue结尾的 既然是.vue结尾&#xff0c;那么直接给浏览器是不能运行的&#xff0c;.vue文件是vue团队打造的特殊文件&#xff0c;想让.vue文件让浏览器识别并且运行&#xff0c;需要对它进行处理加工成纯…

07_scrapy的应用——获取电影数据(通过excel保存静态页面scrapy爬虫数据的模板/通过数据库保存)

0、前言: 一般我们自己创建的一些python项目,我们都需要创建虚拟环境,其中会下载很多包,也叫做依赖。但是我们在给他人分享我们的项目时,不能把虚拟环境打包发送给别人,因为每个人电脑系统不同,我们可以把依赖导出为依赖清单,然后别人有了我们的依赖清单,就可以用一条…

Docker consul的容器

consul服务更新和服务发现 什么是服务注册与发现 服务注册与发现是微服务架构中不可或缺的重要组件。起初服务都是单节点的&#xff0c;不保障高可用性&#xff0c;也不考虑服务的压力承载&#xff0c;服务之间调用单纯的通过接口访问。直到后来出现了多个节点的分布式架构&…

优维低代码实践:模板

优维低代码技术专栏&#xff0c;是一个全新的、技术为主的专栏&#xff0c;由优维技术委员会成员执笔&#xff0c;基于优维7年低代码技术研发及运维成果&#xff0c;主要介绍低代码相关的技术原理及架构逻辑&#xff0c;目的是给广大运维人提供一个技术交流与学习的平台。…