2.Hashtable继承的类和实现的接口:(Dictionary类已经被废弃了)
public class Hashtable
extends Dictionary
implements Map, Cloneable, java.io.Serializable {
HashMap继承的类和实现的接口:
public class HashMap extends AbstractMap
implements Map, Cloneable, Serializable {
由此可见它们继承的类不相同,只不过都实现了 Map,Cloneable,Serializable 接口
3.对外提供的接口不同
Hashtable比HashMap多提供了elments() 和contains() 两个方法。
elments() 方法继承自Hashtable的父类Dictionnary。elements() 方法用于返回此Hashtable中的value的枚举。
contains()方法判断该Hashtable是否包含传入的value。它的作用与containsValue()一致。事实上,contansValue() 就只是调用了一下contains() 方法。
public boolean containsValue(Object value) {
return contains(value);
}
4. Hashtable不允许Key为null,也不允许Value为null。而HashMap允许Key为null
HashMap当有多个Key为null时,会将Value覆盖。可以有一个或多个Key所对应的值为null。当get()方法返回null值时,可能是 HashMap 中没有该键,也可能使该键所对应的值为null。因此,在HashMap中不能由get()方法来判断HashMap中是否存在某个键, 而 应 该用containsKey()方法来判断。
5. 初始容量大小和每次扩充容量大小的不同
Hashtable默认的初始大小为11,之后每次扩充,容量变为原来的2n+1。HashMap默认的初始化大小为16。之后每次扩充,容量变为原来的2倍。
创建时,如果给定了容量初始值,那么Hashtable会直接使用你给定的大小,而HashMap会将其扩充为2的幂次方大小。也就是说Hashtable会尽量使用素数、奇数。而HashMap则总是使用2的幂作为哈希表的大小。
6.计算hash的方式不同
HashMap中有个hash方法,通过hash.hashCode方法计算出一个值,通过右移16位与之相异或,从而得到新的hash值。
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
Hashtable通过计算key的hashCode()来得到hash值就为最终hash值。
7.解决hash地址冲突的方式不同
Java8,HashMap中,当出现冲突时可以:
1.如果冲突数量小于8,则是以链表方式解决冲突。
2.而当冲突大于等于8时,就会将冲突的Entry转换为**红黑树进行存储。**
3.而又当数量小于6时,则又转化为链表存储。
而Hashtable一直以链表形式存储
参考文章:https://blog.csdn.net/wangxing233/article/details/79452946
作者:赵不懂zzz