相同点:
二者都是基于哈希表(也称为哈希数组)+链表实现的,每个元素都是key-value键值对。
内部都是通过单链表解决冲突问题(不同的key映射到同一个哈希表的同一个位置),容量都会自增长。
都实现了Serializable接口,Cloneable接口。
负载因子都为0.75f,都有四个构造方法。
不同点:
Hashtable是线程安全的,HashMap是线程不安全的。
Hashtable默认容量大小是11,HashMap默认容量大小是16,Hashtable不要求底层数组的容量一定要为2的整数次幂,而HashMap则要求一定为2的整数次幂。
Hashtable中key和value都不允许为null,而HashMap中key和value都允许为null。Hashtable中put(null,null)编译可以通过,运行报空指针异常。
Hashtable扩容时,将容量变为原来的2倍加1,而HashMap扩容时,将容量变为原来的2倍。
Hashtable计算hash值,直接用key的hashCode(),而HashMap重新计算了key的hash值,Hashtable在求hash值对应的位置索引时,用取模运算,而HashMap在求位置索引时,则用与运算,且这里一般先用hash&0x7FFFFFFF后,再对length取模,&0x7FFFFFFF的目的是为了将负的hash值转化为正值,因为hash值有可能为负数,而&0x7FFFFFFF后,只有符号外改变,而后面的位都不变。 |
|