• HashMap 和 Hashtable 的同和不同


    综述

    可以直接根据 hashcode 值判断两个对象是否相等吗?肯定是不可以的,因为不同的对象可能会生成相同的 hashcode 值。虽然不能根据 hashcode 值判断两个对象是否相等,但是可以直接根据 hashcode 值判断两个对象不等,如果两个对象的 hashcode 值不等,则必定是两个不同的对象。如果要判断两个对象是否真正相等,必须通过 equals 方法。

    也就是说对于两个对象,如果调用 equals 方法得到的结果为 true,则两个对象的 hashcode 值必定相等;如果 equals 方法得到的结果为 false,则两个对象的 hashcode 值不一定不同;如果两个对象的 hashcode 值不等,则 equals 方法得到的结果必定为 false;如果两个对象的 hashcode 值相等,则 equals 方法得到的结果未知。

    HashMap 和 Hashtable 不保证 map 的顺序,也不保证顺序不会随着时间不变。

    HashMap 实例有两个参数影响性能:初始 capacity 和 load factor。capacity 是 hashtable 中桶的数量,初始 capacity 就是 hashtable 创建时的 capacity。load factor 影响 hashtable 多满时允许自动增加 capacity。当 hashtable 中 entry 的数量超过 load factor 和当前 capacity 的乘积,hashtable 会重新哈希(意味着,内部数据结构重建)因此 hashtable 大约拥有桶数量的两倍。

    作为通用规则,默认 load factor(0.75)在时间和空间消耗上提供了好的权衡。值越大,空间开销越小,但是遍历成本增加(表现在大多数操作,包括 get 和 put)。当设置初始 capacity 时,为了最小化重新 hash 的操作次数,应该考虑 map的 entry 数量和 load factor。如果初始容量大于最大 entry 数量除以 load factor ,重新 hash 操作将不会发生。然而,设置初始 capacity 太大会浪费空间。

    如果许多 mapping 存储在 HashMap 实例中,创建时使用足够大的 capacity 将允许 mapping 存储得更有效率,因为不会随着 table 的数量增大重新 hash。注意使用许多相同 hashCode() 的 key 肯定会降低任意 hashtable 的性能。

    相同点

    成员变量
    DEFAULT_LOAD_FACTOR 0.75
    TREEIFY_THRESHOLD 8
    UNTREEIFY_THRESHOLD 6
    MIN_TREEIFY_CAPACITY否则resize() 64
    size mapping 数量
    threhold capacity*load factor

    不同点

    HashMap Hashtable
    线程安全 不安全 安全
    允许null的键和值 允许 不允许
    实现和继承 实现Map 实现Map,继承Dictionary
    遍历方式 Iterator Iterator和Enumeration
    计算哈希值 (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16) (key.hashCode() & 0x7FFFFFFF)
    计算数组下标 (length - 1) & hash hash % length
    DEFAULT_INITIAL_CAPACITY 16 11
    容量增加方式 old*2长度始终为2的幂 old*2+1
    构造函数 threshold=tableSizeFor(initialCapacity) threhold=initialCapacity*load factor
    resize 从0-cap链表顺序不变 从cap-0链表顺序相反

    注意点:

    计算数组下标:当length总是2的n次方时,h & (length - 1)运算等价于对 length 取模,也就是 h % length,但是&比%具有更高的效率。

    容量增加方式:当数组长度为 2 的 n 次幂的时候,不同的 key 算得的 index 相同的几率较小,那么数据在数组上分布就比较均匀,也就是说碰撞的几率小。相对的,查询的时候就不用遍历某个位置上的链表,这样查询效率也就较高了。导致 resize() 不同 HashMap 直接使用之前的数组下表,而 Hashtable 需要重新计算。

  • 相关阅读:
    Swift:属性观察器
    swift:谈谈swift几种常见属性的区别
    iOS:崩溃统计工具Crashlytics的使用
    【互动出版网】2013双11全场科技图书六折包邮
    【互动出版网】11.11购物狂欢节重磅大促,免费领万千优惠券
    C#编程兵书
    C++编程兵书
    HTML+CSS网站开发兵书
    Java编程兵书
    网络运维与管理2013超值精华本
  • 原文地址:https://www.cnblogs.com/studyhs/p/9088229.html
Copyright © 2020-2023  润新知