美文网首页
HashMap Hashtable CurrentHashMap

HashMap Hashtable CurrentHashMap

作者: 瀚海网虫 | 来源:发表于2020-11-11 13:14 被阅读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

    相关文章

      网友评论

          本文标题:HashMap Hashtable CurrentHashMap

          本文链接:https://www.haomeiwen.com/subject/npasbktx.html