Collection接口详细介绍(上)

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 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 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。

© 版权声明
THE END
喜欢就支持一下吧
点赞0

Warning: mysqli_query(): (HY000/3): Error writing file '/tmp/MYhbq7te' (Errcode: 28 - No space left on device) in /www/wwwroot/583.cn/wp-includes/class-wpdb.php on line 2345
admin的头像-五八三
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

图形验证码
取消
昵称代码图片