集合
Java集合是java提供的一个工具包,全部继承自java.util.*
。主要包括两大接口Collection
接口和Map
接口以及相关的工具类(Iterator
迭代器接口、Enumeration
枚举类、Arrays
和Colletions
)。
(1)Collection
是一个接口,包含List
列表和Set
集合。其中List
是有序的队列,元素值可以重复,索引从0开始,实现类有LinkedList
,ArrayList
,Vector
;而Set
是一个不允许有重复元素的集合,Set
的实现类有HashSet
和TreeSet
。HashSet
依赖于HashMap
,它实际上是通过HashMap
实现的;TreeSet
依赖于TreeMap
,它实际上是通过TreeMap
实现的。
(2)Map是一个映射接口,通过key-value
键值对实现。实现类有HashMap
,TreeMap
,WeakHashMap
,Hashtable
。
(3)Iterator
是遍历集合的工具,Enumeration
也是遍历集合,但它的的功能要比Iterator
少,只能在Hashtable
, Vector
, Stack
中使用。
(4)Arrays
和`Collections是操作数组、集合的两个工具类。
下面是具体一点的比较:
(1) ArrayList
, LinkedList
, Vector
, Stack
是List的4个实现类,比较他们的异同。
1)ArrayList
是一个数组队列,相当于动态数组。它由数组实现,随机访问效率高,随机插入、随机删除效率低。默认大小是10元素
2)LinkedList
是一个双向链表。它也可以被当作堆栈、队列或双端队列进行操作。LinkedList
随机访问效率低,但随机插入、随机删除效率高。
3)Vector
是矢量队列,和ArrayList
一样,它也是一个动态数组,由数组实现。但是ArrayList
是非线程安全的,而Vector
是线程安全的。
4)Stack
是栈,它继承于Vector
。它的特性是:先进后出(FILO, First In Last Out)。
(2)HashMap
、HashTable
、TreeMap
的区别
1)HashMap
是键值对的方式存储的,但不能保证次序,单线程;默认大小16、 默认扩容因子为0.75, 结构1.7之前(数组+链表)、1.8之后(数组+链表+红黑树)
HashMap在JDK1.8及以后的版本中引入了红黑树结构,若桶中链表元素个数大于等于8时,链表转换成树结构;若桶中链表元素个数小于等于6时,树结构还原成链表。因为红黑树的平均查找长度是log(n),长度为8的时候,平均查找长度为3,如果继续使用链表,平均查找长度为8/2=4,这才有转换为树的必要。链表长度如果是小于等于6,6/2=3,虽然速度也很快的,但是转化为树结构和生成树的时间并不会太短。
还有选择6和8,中间有个差值7可以有效防止链表和树频繁转换。假设一下,如果设计成链表个数超过8则链表转换成树结构,链表个数小于8则树结构转换成链表,如果一个HashMap不停的插入、删除元素,链表个数在8左右徘徊,就会频繁的发生树转链表、链表转树,效率会很低。
2)HashTable
与HashMap
存储方式相同,但是是线程安全的;
3)TreeMap
是有序的键值对,基于红黑树排序。