JAVA集合map、list、set详解



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(数组的下标)

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值