您的位置:首页 > 编程语言 > Java开发

Java基础-了解Hashtable

2016-01-22 14:12 363 查看
Hashtable和HashMap都是Map接口的实现类,方法是一样的,实现也差不多,主要说下不同

*Hashtable线程安全,HashMap非线程安全。

Hashtable主要是在各个关键操作(put、putAll、get等)加了synchronized关键字来保证线程安全。这样也导致了Hashtable效率要低些。因为n个线程都会抢一把锁,无论读或者写,抢到的线程进行操作,抢不到的只能等了。

*Hashtable不允许null值,HashMap允许

//Hashtable的put操作
public synchronized V put(K key, V value) {
// Make sure the value is not null
if (value == null) {
throw new NullPointerException();
}
...
}


*Hashtable继承了Dictionary,HashMap则继承了AbstractMap,据说是因为历史原因(Hashtable从jdk1.0就有了,HashMap到1.2才有的)

public class Hashtable<K,V>
extends Dictionary<K,V>
implements Map<K,V>, Cloneable, java.io.Serializable {
...
}


public class HashMap<K,V>
extends AbstractMap<K,V>
implements Map<K,V>, Cloneable, Serializable{
...
}


*数组下标bucketIndex计算方式不同

HashMap是让hash值与(length-1)进行&运算获得

static int indexFor(int h, int length) {
return h & (length-1);
}


Hashtable是进行取余获的,前面的&运算是为了保证值为正数(如果本身就是正数,计算的结果和原本的hash值是一样的),再进行取余

index = (hash & 0x7FFFFFFF) % tab.length;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  hashtable java