HashMap Hashtable CurrentHashMap

2020-11-11  本文已影响0人  瀚海网虫

1. HashMap

JDK 1.7 之前: 底层 数组 + 链表 (链表过大时,查询效率太低,所以有了JDK 1.8 的红黑树)
JDK 1.8 以后: 底层数据 + 红黑树

可以存储null 键,null 值 ,线程不安全
初始size为16

容量(capacity):Hash 表中桶的数量
初始化容量(initialCapacity):允许有参构造子中指定初始容量
负载因子(loadfactor):如不指定,默认是0.75,这个指定的值 又叫 “负载极限”。 同时兼顾了 查询数据所带来的 时间开销与内存开销。

核心要素:

  1. 哈希冲突:相同的key value 计算存储位置相同,成为发生了哈希冲突
  2. 加载因子:为降低哈希冲突几率,当HashMap 中键值对大小达到一定数值时,自动触发扩容动作。
  3. 空间换时间:如果希望提升查询性能,可以适当提高初始容量,降低加载因子大小,以便用空间换时间。

HashMap什么对象能做为key?
重写过hashCode和equals的对象,才能做为key,如果要将对象做为key,需要重写hashCode和equals。

2. ConcurrentHashMap

JDK 1.7 : Segment + HashEntry 的实现
JDK 1.8 : Node + CAS + Synchronized 实现(有红黑树与链表两种结构)

线程安全,不似HashTable 锁,缩小了锁的作用范围,提升了性能。
思想:锁分段技术
Segment: 可重入锁 ReentrantLock 控制并发
锁对象:Entry 数组

3. HashTable

已不推荐使用
底层数组+链表实现
初始size为11,扩容:newsize = olesize*2+1

上一篇下一篇

猜你喜欢

热点阅读