Java基础-了解Hashtable

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/QQ1142003960/article/details/50560274

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;

猜你喜欢

转载自blog.csdn.net/QQ1142003960/article/details/50560274