Java 集合框架主要包括两种类型的容器:
(1)集合(Collection)
(2)图(Map)
Collection 接口又有 3 种子类型,List、Set 和 Queue。
List 接口扩展自 Collection,它可以定义一个允许重复的有序集合,从 List 接口中的方法来看,List 接口主要是增加了面向位置的操作,允许在指定位置上操作元素,同时增加了一个能够双向遍历线性表的新列表迭代器 ListIterator。AbstractList 类提供了 List 接口的部分实现,AbstractSequentialList 扩展自 AbstractList,主要是提供对链表的支持。
ArrayList 数组列表,有序,可重复,内部是通过Array实现。对数据列表进行插入、删除操作时都需要对数组进行拷贝并重排序。因此在知道存储数据量时,尽量初始化初始容量,提升性能。
LinkedList 双向链表,每个元素都有指向前后元素的指针。顺序读取的效率较高,随机读取的效率较低。
Vector 向量,线程安全的列表,与 ArrayList 一样也是通过数组实现的,不同的是 Vector 是线程安全的,也即同一时间下只能有一个线程访问 Vector,线程安全的同时带来了性能的耗损,所以一般都使用 ArrayList。
Stack 栈,后进先出(LIFO),继承自 Vector,也是数组,线程安全的栈。但作为栈数据类型,不建议使用 Vector 中与栈无关的方法,尽量只用 Stack 中的定义的栈相关方法,这样不会破坏栈数据类型。
ArrayQueue 数组队列,先进先出(FIFO)
Set 集合不允许包含相同的元素,Set 判断两个对象相同不是使用 == 运算符,而是根据 equals 方法。也就是说,只要两个对象用 equals 方法比较返回的是 true,Set 就不会接受这两个对象;反之,只要两个对象用 equals 方法比较返回 false,Set 就会接受这两个对象。
HashSet 基于 HashMap 实现的集合,对HashMap做了一些封装。与HaspMap不同的是元素的保存为链表形式,插入数据时遍历链表查看是否有相同数据,有则返回false,没有则返回true.
LinkedHashSet 链表集合,继承自HashSet与LinkedHashMap相似,是对LinkedHashMap的封装。
TreeSet 红黑树集合,与TreeMap相似,是对TreeMap的封装。
队列是一种先进先出的数据结构,元素在队列末尾添加,在队列头部删除。Queue 接口扩展自 Collection 接口,并提供插入、提取、检验等操作。
接口 Deque,是一个扩展自 Queue 的双端队列,它支持在两端插入和删除元素。
ArrayDeque 数组实现的双端队列,可以在队列两端插入和删除元素
LinkedList 类实现了 Deque 接口,所以通常我们可以使用 LinkedList 来创建一个队列。
PriorityQueue 类实现了一个优先队列,优先队列中元素被赋予优先级,拥有高优先级的先被删除。
Map 用于保存具有映射关系的数据,因此 Map 集合里保存着两组值,一组值用于保存 Map 里的 key,另外一组用于保存 Map 里的 value,key 和 value 之间存在单向的一对一的关系,即通过指定的 key,总能找到唯一的、确定的 value。
HashMap 哈希映射/字典,无序字典,键值对数据,key是唯一的,Key 和 Value 都可以为null
TreeMap 红黑树实现的 key->value 融合,可排序,红黑树是一种自平衡二叉查找树。
LinkedHashMap 链表映射/字典,继承了 HashMap 的所有特性,同时又实现了双向链表的特性,保留了元素插入顺序。