马士兵 Java高级互联网架构师P5/P6/P7/P8/P9

List、Set、Map的区别

List:是可以重复的,有序集合,继承Collection接口。
Set:不允许重复的集合,继承Collection接口,TreeSet有序,HashSet无序。
Map:存储键值对,Key不允许重复,但是Value允许重复,不继承Collection接口

HashMap、LinkedHashMap、Hashtable、ConcurrentHashMap的区别

线程安全性:HashMap、LinkedHashMap是非线程安全的,Hashtable和ConcurrentHashMap是线程安全的,其中Hashtable是使用Synchronized的整体对象锁,效率较低目前已舍弃使用;
ConcurrentHashMap在jdk1.7的时候使用分段锁,在jdk1.8之后使用CAS和Synchronized锁直接对链表和红黑树进行同步操作,当插入对象的hash对应的数组槽位为null时,使用CAS进行操作,否则使用Synchronized对当前的链表或红黑树进行加锁(jdk1.6之后对Synchronized进行优化,性能提升了很多),获取数据时使用getObjectVolatile保证数据一致性。
底层数据结构:HashMap和HashTable在jdk1.8之前使用数组+链表的结构,在jdk1.8之后HashMap在链表长度大于8时转为红黑树,Hashtable没有变;ConcurrentHashMap在jdk1.7使用分段数组+链表,在jdk1.8之后使用和HashMap一样的结构,LinkedHashMap是在HashMap基础上套了层链表,使其有序。
对Null Key和Null Value的支持:HashMap和LinkedHashMap的Key和Value都支持Null,但是只能一个Key为Null,Hashtable和ConcurrentHashMap的Key和Value都不支持Null。
扩容机制:HashMap、LinkedHashMap和ConcurrentHashMap默认容量为16,每次扩容为2n倍,指定容量时,实际容量是大于等于指定容量2的幂次方;Hashtable默认容量是11,每次扩容为2n+1倍,指定容量时实际容量就是指定容量。

上一篇:javascript – iOS选择onchange而不是触发


下一篇:高阶组件-HOC