HashMap和和Hashtable的区别的区别
Hashtable和HashMap的区别:
Hashmap是开发中用的比较多的一种集合,是线程不安全的,Hashtable的方法上大多都加了synchronized所以是线程安全
的,所以效率并不高。这也是它们最大的不同。
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一直以链表形式存储
评论0
最新资源