这一次来介绍一下常用的集合:
首先是两种集合的《家庭系谱图》:
接下来介绍一下集合的种类:
Collection
Set
-
SetTreeSet:基于红⿊树实现,⽀持有序性操作,例如:根据⼀个范围查找元素的操作。但是查找效率不如HashSet,HashSet 查找的时间复杂度为 O(1),TreeSet 则为 O(logN)。
-
HashSet:基于哈希表实现,⽀持快速查找,但不⽀持有序性操作。并且失去了元素的插⼊顺序信息,也就是说使⽤ Iterator 遍历 HashSet 得到的结果是不确定的。
-
LinkedHashSet:具有 HashSet 的查找效率,且内部使⽤双向链表维护元素的插⼊顺序。
List
-
ArrayList:基于动态数组实现,⽀持随机访问。
-
Vector:和 ArrayList 类似,但它是线程安全的。
-
LinkedList:基于双向链表实现,只能顺序访问,但是可以快速地在链表中间插⼊和删除元素。不仅如此,LinkedList 还可以⽤作栈、队列和双向队列。
Queue
-
LinkedList:可以⽤它来实现双向队列。
-
PriorityQueue:基于堆结构实现,可以⽤它来实现优先队列。
Map
-
TreeMap:基于红⿊树实现。
-
HashMap:基于哈希表实现。
-
HashTable:和 HashMap 类似,但它是线程安全的,这意味着同⼀时刻多个线程可以同时写入并且不会导致数据不⼀致。它是遗留类,不应该去使⽤它。现在可以使⽤ ConcurrentHashMap 来⽀持线程安全,并且 ConcurrentHashMap 的效率会更⾼,因为 ConcurrentHashMap 引⼊了分段锁。
-
LinkedHashMap:使⽤双向链表来维护元素的顺序,顺序为插⼊顺序或者最近最少使⽤(LRU)顺序。
三种常用的集合有什么区别呢?
-
List
有序集合:List中的元素有序,即元素按照添加的顺序排列。 允许重复:List可以包含重复的元素。
实现类:常见的实现类有ArrayList、LinkedList和Vector等。 常用操作:支持通过索引来访问元素,例如get(int index)。 用途:适用于需要元素有序或需要经常通过索引访问元素的场景。 -
Set
无序集合:Set中的元素无序,元素的顺序可能会在每次插入或删除操作后发生变化。
不允许重复:Set不允许包含重复的元素,每个元素都是唯一的。
实现类:常见的实现类有HashSet、TreeSet和LinkedHashSet等。
常用操作:主要提供添加、删除和检查元素是否存在的操作。 用途:适用于需要确保元素唯一性的场景,例如去重、集合操作等。 -
Map
键值对集合:Map存储键值对(key-value pairs),每个键映射到一个值。 键的唯一性:Map中的键是唯一的,但值可以重复。
实现类:常见的实现类有HashMap、TreeMap和LinkedHashMap等。
常用操作:通过键来访问、添加或删除对应的值,例如get(Object key)、put(K key, V value)。
用途:适用于需要根据键来快速查找、更新或删除值的场景,例如数据库索引、缓存等。
总结:List适用于需要元素有序或索引访问的场景;Set适用于需要元素唯一且无序的场景;Map适用于需要通过键来存储和访问值的场景。
下来是常用的集合中ArrayList 和LinkedList的一些辨别
ArrayList 和LinkedList的区别?
ArrayList:底层是基于数组实现的,查找快,增删较慢;
LinkedList:底层是基于链表实现的。确切的说是循环双向链表(JDK1.6 之前是双向循环链表、JDK1.7 之后取消了循环),查找慢、增删快。LinkedList 链表由⼀系列表项连接⽽成,⼀个表项包含 3 个部分:元素内容、前驱表和后驱表。链表内部有⼀个 header 表项,既是链表的开始也是链表的结尾。header 的后继表项是链表中的第⼀个元素,header 的前驱表项是链表中的最后⼀个元素。
ArrayList 的增删未必就是⽐ LinkedList 要慢:
- 如果增删都是在末尾来操作【每次调⽤的都是 remove() 和 add()】,此时 ArrayList 就不需要移动和复制数组来进⾏操作了。如果数据量有百万级的时,速度是会⽐ LinkedList 要快的。
就不需要移动和复制数组来进⾏操作了。如果数据量有百万级的时,速度是会⽐ LinkedList 要快的。
- 如果删除操作的位置是在中间。由于 LinkedList 的消耗主要是在遍历上,ArrayList 的消耗主要是在移动和复制上(底层调⽤的是 arrayCopy() ⽅法,是 native ⽅法)。LinkedList 的遍历速度是要慢于
ArrayList 的复制移动速度的如果数据量有百万级的时,还是 ArrayList 要快。