DESKTOP-7J91214_20200911-张军强

1.问题

HashMap 和 Hashtable 的区别

相同

  • 两者都实现 Map 接口,用于存放 键-值对
  • 内部都采用 哈希表 实现,都采用 哈希算法计算键-值对的存放位置
  • 键(key)不能重复,键唯一,而值(value)可以重复

区别

  • 扩容方式不同

    • Hashtable:当 Entry 个数大于 阈值(threshold) 时就扩容,创建Hashtable实例时就创建其内部的数组
      • 扩容方式: newCapacity = ( oldCapacity << 1 ) + 1
    • HashMap :当 Entry 个数大于等于 阈值(threshold) 时就扩容,创建HashMap实例时并未创建内部的数组,是首次调用put方法时才会创建内部数组
    • 扩容方式: newCapacity = oldCapacity << 1
  • 是否支持线程安全

    • HashMap 非线程安全,理论上效率较高
    • Hashtable 线程安全,理论上效率较低
  • 内部实现不同

    • 从 JDK 1.8 ( Java 8 ) 开始,HashMap 内部采用 数组 + 链表 + 红黑树 方式存储
    • 当链表长度大于8时会自动转换成红黑树
    • 当链表长度小于6时,红黑树重新转换成链表
    • 而 Hashtable 内部则采用 数组 + 链表 实现
  • 对元素位置的计算方法不同

    • HashMap内部专门定义了一个类方法(hash)用于根据key.hashCode()返回一个新的数值

    随后再通过该数值结合数组长度计算Entry的存放位置

    • Hashtable 内部直接采用 key.hashCode() 来确定元素存放位置

    int hash = key.hashCode() ; int index = ( hash & 0x7FFFFFFF ) % tab.length ;

  • 两者所继承的类不同

    • HashMap 类继承 java.util.AbstractMap
    • Hashtable 类继承 java.util.Dictionary
  • 是否支持 null

    • HashMap 键 和 值都可以为null

    • Hashtable 键 和 值都不可以为null

2.吐槽

有时候莫名有点烦,艾希。

标签

© 2021 成都云创动力科技有限公司 蜀ICP备20006351号-1