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 需要重新计算。
HashMap 和 Hashtable 的同和不同的更多相关文章
- Java集合专题总结(1):HashMap 和 HashTable 源码学习和面试总结
2017年的秋招彻底结束了,感觉Java上面的最常见的集合相关的问题就是hash--系列和一些常用并发集合和队列,堆等结合算法一起考察,不完全统计,本人经历:先后百度.唯品会.58同城.新浪微博.趣分 ...
- java面试题——HashMap和Hashtable 的区别
一.HashMap 和Hashtable 的区别 我们先看2个类的定义 public class Hashtable extends Dictionary implements Map, Clonea ...
- Map集合及与Collection的区别、HashMap和HashTable的区别、Collections、
特点:将键映射到值的对象,一个映射不能包含重复的键,每个键最多只能映射到一个值. Map集合和Collection集合的区别 Map集合:成对出现 (情侣) ...
- HashMap和 Hashtable的比较
Hashtable 和 HashMap的比较 1. HashMap可以接受null(HashMap可以接受为null的键值(key)和值(value), HashTable不可以接受为null的键( ...
- hashMap和hashTable的区别
每日总结,每天进步一点点 hashMap和hashTable的区别 1.父类:hashMap=>AbstractMap hashTable=>Dictionary 2.性能:hashMap ...
- HashMap和HashTable到底哪不同?
HashMap和HashTable有什么不同?在面试和被面试的过程中,我问过也被问过这个问题,也见过了不少回答,今天决定写一写自己心目中的理想答案. 代码版本 JDK每一版本都在改进.本文讨论的Has ...
- java分享第七天-01(Hashmap和Hashtable的区别&Property)
一.Hashmap和Hashtable的区别 1 主要:Hashtable线程安全,同步,效率相对低下 HashMap线程不安全,非同步,效率相对高 2 父类:Hashtable是Dictionary ...
- HashMap底层实现原理/HashMap与HashTable区别/HashMap与HashSet区别
①HashMap的工作原理 HashMap基于hashing原理,我们通过put()和get()方法储存和获取对象.当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算h ...
- HashMap、HashTable、LinkedHashMap和TreeMap用法和区别
Java为数据结构中的映射定义了一个接口java.util.Map,它有四个实现类,分别是HashMap.HashTable.LinkedHashMap和TreeMap.本节实例主要介绍这4中实例的用 ...
- Java重点之小白解析--浅谈HashMap与HashTable
这是一个面试经常遇到的知识点,无论什么公司这个知识点几乎是考小白必备,为什么呢?因为这玩意儿太特么常见了,常见到你写一百行代码,都能用到好几次,不问这个问哪个.so!本小白网罗天下HashMap与Ha ...
随机推荐
- curl download zip file
https://askubuntu.com/questions/285976/download-zip-file-with-curl-command
- iOS启动图 LaunchImage LaunchScreen.xib
1.Images.xcassets添加LaunchImage 2.具体大小和添加类别都是可以调的 640*960 (4/4s) 2X ...
- python之路 --- python文件模式
文件模式: 打开文件的模式有: r,只读模式(默认). w,只写模式.[不可读:不存在则创建:存在则删除内容:] a,追加模式.[可读: 不存在则创建:存在则只追加内容:] "+&quo ...
- [adb 学习篇] adb常用命令
https://testerhome.com/topics/2565 Android 常用 adb 命令总结 针对移动端 Android 的测试, adb 命令是很重要的一个点,必须将常用的 adb ...
- [uiautomator篇][1] 官网译文
http://www.jianshu.com/p/7718860ec657 2016.07.25 20:59 字数 3675 Android UIAutomator浅谈 --------------- ...
- python ConfigParser 的小技巧
$ cat format.conf [DEFAULT] conn_str = %(dbn)s://%(user)s:%(pw)s@%(host)s:%(port)s/%(db)s dbn = mysq ...
- Welcome-to-Swift-19类型嵌套(Nested Types)
枚举类型常被用于实现特定类或结构体的功能.也能够在有多种变量类型的环境中,方便地定义通用类或结构体来使用,为了实现这种功能,Swift允许你定义类型嵌套,可以在枚举类型.类和结构体中定义支持嵌套的类型 ...
- 【Luogu】P1472奶牛家谱(DP)
题目链接 这是一道考思维的好题. 一开始设f[i][j]是i个点刚好j层的方案数,死活调不出来,看题解发现可以改为<=j层的方案数,最后输出f[n][m]-f[n][m-1]就好了. 对于计算考 ...
- 【Luogu】P2486染色(树链剖分)
题目链接 线段树维护左端颜色,右端颜色,颜色段数量. 合并的时候看左子树的右端颜色是不是等于右子树的左端颜色,如果等于那么颜色段数量要-1S 然后在树剖跳链的时候搞同样的操作qwq 然后就没有然后了 ...
- bzoj 2791 [Poi2012]Rendezvous 基环森林
题目大意 给定一个n个顶点的有向图,每个顶点有且仅有一条出边. 对于顶点i,记它的出边为(i, a[i]). 再给出q组询问,每组询问由两个顶点a.b组成,要求输出满足下面条件的x.y: 从顶点a沿着 ...