Map中常用的5个集合
HashMap
HashMap是非线程安全的(无序的),K和V都可以为null,由于非线程安全所以效率会比较高。HashMap是HashTable的轻量级非线程安全的实现。
LinkedHashMap
LinkedHashMap继承HashMap,但是可以根据插入的顺序取出(当内部属性accessOrder=true是,在此基础上还可以根据最近访问的元素排序)。LinkedHashMap的K和V都可以为null,效率低于HashMap。
HashTable
HashTable是线程安全的(无序的),K和V都不可以为空,之所以线程安全是因为在操作内部属性的方法上都加了synchronized关键字。
ConcurrentHashMap
ConcurrentHashMap是线程安全的(无序的),K和V都不可以为空,ConcurrentHashMap是在操作内部属性的方法内部加了synchronized块相对比HashTable效率会更快一点。
TreeMap
TreeMap是非线程安全的,一个有序的集合,根据K进行排序。K和V都不可以为空,TreeMap是内部是二叉树的形式,由于插入和取出都要遍历树,所以读取和添加元素效率都比较低。
List中常用的3个集合
ArrayList
ArrayList是非线程安全的,按照插入顺序排序。内部是一个object数组,长度默认是10,如果超过当前长度,会new一个长度为之前1.5倍的object数组,然后将之前数据复制过来。当删除元素时也是使用复制的方式,例:删除元素下标为5,共有10个元素,那么就将下标为6-9的元素复制到5-8的位置,再将下标为9的元素置为空。ArrayList特点是读取速度快,删除和插入速度慢(取决于要元素位置,及数组长度)。
LinkedList
LinkedList是非线程安全的,默认是按插入顺序排序(比如都使用add函数插入)。内部使用Node对象链表。LinkedList特点是插入删除速度快(对比ArrayList,ArrayList需要复制数组),但是查询很慢,因为每次查询都是从头或是从尾遍历查找。
Vector
Vector是线程安全的,内部结构与排序与ArrayList一样。Vector的自动扩容与ArrayList不一样,没有默认长度。从0开始每次扩容是新增一个原来长度2倍object数组,然后复制。Vector还可以通过设定capacityIncrement的值,然后每次扩容固定的长度为capacityIncrement。Vector在操作内部属性的方法上都加了synchronized关键字。
Set中常用的4个集合
HashSet
HashSet是非线程安全的,是基于HashMap的。使用的HashMap的K,V=new Object()。
LinkedHashSet
LinkedHashSet是非线程安全的,继承HashSet,内部是操作的LinkedHashMap。
TreeSet
TreeSet是非线程安全的,是基于TreeMap。
CopyOnWriteArraySet
CopyOnWriteArraySet是线程安全的,是基于CopyOnWriteArrayList的。CopyOnWriteArrayList每添加一个元素,就要new一个长度为原来+1的object数组,然后进行复制操作。CopyOnWriteArrayList在进入操作元素的方法后先加了锁,离开前再解锁,所以是线程安全的。
使用总结
线程安全
HashTable、ConcurrentHashMap、Vector、CopyOnWriteArraySet。
效率高
Map有HashMap
List有ArrayList(查询速度快)、LinkedList(写入速度快)
Set有HashSet
有顺序
Map有LinkedHashMap(默认按插入顺序)、TreeMap(按照K的大小排序)
List有ArrayList(数组的下标)LinkedList(默认是插入顺序,也可从头部或尾部或中间插入)
Set有LinkedHashSet(默认按插入顺序)、TreeSet(按照大小排序)、CopyOnWriteArraySet(数组的下标)