Java集合有两种接口:Collection 和 Map,Collection用来存放单个元素,Map用来存放键值对
Collection下又有三个接口:List Set Queue
Map只有它本身这一个接口
tips:List中的元素有序可重复 Set中的元素无需不可重复 Map键不能重复,值可以
一般我们都是使用集合的实现类
List有以下的实现类:ArrayList LinkedList Vector Stack
Arraylist:ArrayList是最常用的集合,其内部实现是一个数组,ArrayList的大小是可以动态扩充的。
Linkedlist:LinkList是一个基于链表的数据结构,每个节点都保存了上一个和下一个节点的指针。
Vector:Vector可以看做是一个线程安全的ArrayList,它内部也是基于数组实现的,不过几乎所有的集合操作都加了synchronized
关键字。
Stack:Stack类其实继承自Vector,Stack只是在Vector的基础上添加了几个方法以提供栈(Last In First Out LIFO)的特性
Set有以下的实现类:EnumSet HashSet LinkedHashSet TreeSet
Enumset:不常用
Hashset:HashSet的实现很简单,其内部就是一个HashMap
,不过它对元素的顺序没有保证
LinkedHashSet:LinkedHashSet的实现也很简单,其内部用的是一个LinkedHashMap
。因为LinkedHashMap
内部维护了一个双向链表以保持顺序,
所以LinkedHashSet
的特点是它当中的元素是有序的,元素迭代的顺序就是其插入的顺序,元素的再次插入不会影响原有元素的顺序。
Treeset:TreeSet的特点就是内部元素有序,并且有很多导航方法的实现。
Queue有以下实现: LinkedList PriorityQueue
LinkedList:前面的List章节已经提到,它是一个标准队列。
PriorityQueue:队列中的顺序类似于TreeSet,取决于元素的排序规则,即元素对comparable接口的实现或者一个comparator比较器
Map有以下实现:HashMap Hashtable EnumMap IdentityHashMap LinkedHashMap PropertiesT reeMap WeakHashMap
HashMap中的key、value都是无序的。HashMap的内部实现非常值得研究,具体请参考HashMap内部实现
HashTable可以看做是HashMap的重量级实现,其中的大部分方法都加了synchronized关键字,是线程安全的。HashTable
与HashMap的另一个区别是HashMap的key-value
都允许为null,而HashTable不
可以。
LinkedHashMap也是一个HashMap,只是内部维护了一个双向链表以保持顺序,LinkedHashSet
内部实现就是用的LinkedHashMap。
TreeMap中的key、value不但可以保持顺序,类似于TreeSet
和PriorityQueue
,TreeMap中key、value的迭代顺序取决于它们各自的排序规则。