前言:
本篇文章主要讲解Java中的Collection接口以及相关实现类的知识。该专栏比较适合刚入坑Java的小白以及准备秋招的大佬阅读。
如果文章有什么需要改进的地方欢迎大佬提出,对大佬有帮助希望可以支持下哦~
小威在此先感谢各位小伙伴儿了😁
以下正文开始
文章目录
- Collection接口介绍
- List接口详细介绍
- ArrayList实现类
- LinkedList实现类
- 图书推荐
Collection接口介绍
Java中的集合按照存储结构可以分为两大类,单列集合Collection和双列集合Map,本文将先讲解单列集合Collection的相关知识点。
Java中的Collection集合接口是一个用于存储、处理和操作对象的容器,,它有三个主要的子接口,分别是List、Set和Queue。
-
List:List接口是一个有序集合,允许重复元素。它继承了Collection接口并添加了一些额外的方法,如get(int index)、set(int index, E element)等。常见实现类包括ArrayList和LinkedList。
-
Set:Set接口是一个不允许重复元素的集合,保证其内部元素唯一性。它也继承自Collection接口,并且添加了一些特殊的限制条件来保证元素的唯一性。常见实现类包括HashSet和TreeSet。
-
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时需要注意:
-
容量的初始化:可以通过指定初始容量来避免不必要的扩容操作,从而提高效率。通常情况下,可以根据实际数据量的大小来初始化容量。
-
局部变量:为了减少垃圾回收的次数和时间,应该尽可能将ArrayList定义为局部变量,而不是作为类成员变量。
-
使用简化版循环:在遍历ArrayList时,可以使用简化版循环(foreach),这样更加简单直观。
-
线程安全:如果需要在多线程环境下使用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的主要特点:
-
长度可变:和ArrayList一样,LinkedList也可以动态扩展或缩小,适用于元素数量不确定的场景。
-
允许重复元素:和List接口一样,LinkedList也允许包含重复元素。
-
索引操作低效:由于LinkedList底层使用链表实现,在进行索引操作时需要遍历链表,因此较慢。时间复杂度为O(n)。
-
插入/删除高效:由于在任意位置插入或删除元素只需要修改相邻节点的指针,因此这些操作较快。具体来说,在最坏情况下,插入/删除一个元素需要遍历n/2个节点,时间复杂度为O(n)。
-
支持栈和队列操作:由于实现了Deque接口,因此LinkedList支持栈和队列等数据结构的操作。例如push/pop、offer/poll等方法。
-
不支持随机访问:由于索引操作较慢,在进行随机访问时不如ArrayList效率高。如果需要频繁进行随机访问,则应该选择ArrayList。
-
线程不安全:和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本书中任选一本!!!
文章到这里就先结束了,感兴趣的可以订阅专栏哈,后续会继续分享相关的知识点。