综述

可以直接根据 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 需要重新计算。

转载于:https://www.cnblogs.com/studyhs/p/9088229.html

HashMap 和 Hashtable 的同和不同相关推荐

  1. HashMap 和 Hashtable 的 6 个区别,最后一个没几个人知道!

    HashMap 和 Hashtable 是 Java 开发程序员必须要掌握的,也是在各种 Java 面试场合中必须会问到的. 但你对这两者的区别了解有多少呢? 现在,栈长我给大家总结一下,或许有你不明 ...

  2. Java HashMap和Hashtable的区别

    HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable ...

  3. HashMap、HashTable、ConcurrentHashMap、HashSet区别 线程安全类

    HashMap专题:HashMap的实现原理--链表散列 HashTable专题:Hashtable数据存储结构-遍历规则,Hash类型的复杂度为啥都是O(1)-源码分析 Hash,Tree数据结构时 ...

  4. HashMap和Hashtable及HashSet的区别

    Hashtable类     Hashtable继承Map接口,实现一个key-value映射的哈希表.任何非空(non-null)的对象都可作为key或者value.     添加数据使用put(k ...

  5. java源码之HashMap和HashTable的异同

    代码版本 JDK每一版本都在改进.本文讨论的HashMap和HashTable基于JDK 1.7.0_67 1. 时间 HashTable产生于JDK 1.1,而HashMap产生于JDK 1.2.从 ...

  6. HashMap和Hashtable的区别总结

    文章目录 前言 源码分析 继承关系的不同: HashMap Hashtable 是否支持键值为null不同: HashMap Hashtable 初始化和扩容的方式不同: Hashtable Hash ...

  7. HashMap、Hashtable、ConcurrentHashMap的原理与区别

    HashTable 底层数组+链表实现,无论key还是value都不能为null,线程安全,实现线程安全的方式是在修改数据时锁住整个HashTable,效率低,ConcurrentHashMap做了相 ...

  8. 一文读懂JDK7,8,JD9的HashMap,HashTable,ConcurrentHashMap及他们的区别

    内容和标题一样长哦,人家写了好久的.如无特别指明,内容对应的源码是jdk1.7(后面会和1.8对比) 1:hashmap简介(如下,数组-链表形式) HashMap的存储结构 图中,紫色部分即代表哈希 ...

  9. hashMap和hashTable的区别(个人总结)

    首先hashmap和hashtable继承的类不同: 第二:所以从公开的方法上来看,这两个类提供的,是一样的功能.都提供键值映射的服务,可以增.删.查.改键值对,可以对建.值.键值对提供遍历视图.支持 ...

  10. HashMap 和 HashTable 区别

    来源:http://www.importnew.com/7010.html HashMap和Hashtable的区别 HashMap和Hashtable都实现了Map接口,但决定用哪一个之前先要弄清楚 ...

最新文章

  1. GitHub 五万星登顶,命令行的艺术!
  2. x86 的 TSS 任务切换机制
  3. WebClient.Credentials 属性 (System.Net)
  4. python爬虫怎么写多线程_Python爬虫【第3篇】【多线程】
  5. java 怎么用毫秒_java1.8中如何使用精确到毫秒的时间
  6. python传递参数 调用c++ 传递vector_python调用c++传递数组的实例
  7. 数据结构 Tricks(一)—— 父节点和左右孩子索引号之间的关系
  8. 易语言-数据类型及其长度
  9. H5 File 对象获取 Input type=file 文件详细信息
  10. 如何终止运行matlab,matlab终止运行命令
  11. Python 构建 Random Forest 和 XGBoost
  12. Machine Learning 简介与学习路线
  13. 五笔字典86版wubi拆字图编码查询
  14. Gentoo 教程:基本系统安装
  15. 袋鼠云数据库数据同步之flinkx1.10版入门-搭配flink1.11
  16. css 商城 两列_你需掌握的CSS知识都在这了(长文建议收藏,文末有福利)
  17. 2020年chx的计算机保研之路系列(2)——华东师范大学计算机学院(获得优营)
  18. 计算机网络daytime实现之java/python/c++版本
  19. [codeforces1139C]Edgy Trees
  20. 译文:在闭包中使用循环变量是有害的

热门文章

  1. python计算分段函数_Python练习题2.2计算分段函数
  2. Z-BlogPHP主题/名扬图文博客主题模板商业版
  3. youleb多风格响应式博客wordpress主题模板
  4. 原生安卓苹果APP-java抢单派单系统平台源码
  5. linux mount挂载大小,Linux中mount挂载问题小结
  6. 移动端设备判断,ios,android,判断设备,安卓
  7. Sakurairo开源WordPress主题模板
  8. 逍遥自动秒收录导航网源码绿色版+全站SEO优化
  9. Quartz_简单编程式任务调度使用(SimpleTrigger)
  10. 无法在WEB服务器上启动调试,Web 服务器配置不正确 解决