JAVA集合map、list、set详解

来源:互联网 发布:centos 6.5 64位 编辑:程序博客网 时间:2024/06/07 10:36

  • Map中常用的5个集合
    • HashMap
    • LinkedHashMap
    • HashTable
    • ConcurrentHashMap
    • TreeMap
  • List中常用的3个集合
    • ArrayList
    • LinkedList
    • Vector
  • Set中常用的4个集合
    • HashSet
    • LinkedHashSet
    • TreeSet
    • CopyOnWriteArraySet
  • 使用总结
    • 线程安全
    • 效率高
    • 有顺序


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有HashMapList有ArrayList(查询速度快)、LinkedList(写入速度快)Set有HashSet

有顺序

Map有LinkedHashMap(默认按插入顺序)、TreeMap(按照K的大小排序)List有ArrayList(数组的下标)LinkedList(默认是插入顺序,也可从头部或尾部或中间插入)Set有LinkedHashSet(默认按插入顺序)、TreeSet(按照大小排序)、CopyOnWriteArraySet(数组的下标)