HashMap 和 Hashtable

来源:互联网 发布:淘宝哪个买正品乔丹 编辑:程序博客网 时间:2024/06/05 16:37


    学习过程中,遇到了HashMap和Hashtable的问题,各种查询找到了很多总结的很棒的文章和资料,为了更好的学习,小编个人对HashMap 和 Hashtable做一个系统的小结。

    对于HashMap 和 Hashtable,文章从它们的相同点和不同点分别入手,简单认识HashMap 和 Hashtable。

    

    相同点

    存储方式相同,利用一个内部类,实现的是Map.Entity接口,内部实现不一样,但是都是以节点方式进行存储的。是一种单向链表,链表是基于数组的。


    不同点

    1.先看两个类:

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

   可以得出,Hashtable继承自Dictiionary;

    HashMap继承自AbstractMap。

   他们分别继承不同的类。


    2.HashMap可以允许key为null,value为null,HashTable都不允许为null

public synchronized V put(K key, V value) {         // Make sure the value is not null         if (value == null) {             throw new NullPointerException();         }          // Makes sure the key is not already in the hashtable.         Entry<?,?> tab[] = table;         int hash = key.hashCode();         int index = (hash & 0x7FFFFFFF) % tab.length;         @SuppressWarnings("unchecked")         Entry<K,V> entry = (Entry<K,V>)tab[index];         for(; entry != null ; entry = entry.next) {             if ((entry.hash == hash) && entry.key.equals(key)) {                 V old = entry.value;                 entry.value = value;                 return old;             }         }          addEntry(hash, key, value, index);         return null;     }
    可以看到第4行判断了 value 是否为null,那么key是否为null在哪判断的呢?

    大家注意第9行,这里我们调用了key的一个方法hashCode(),这里如果是null的话,这里就不会报错,就会抛出异常。所以key为null的时候,到这里会抛出异常。

    既然这样那么为什么HashMap中的key可以为null呢?

    这是因为HashMap和HashTable它们计算一个对象的hashCode时的方法不一样。HashMap不是直接用对象自己的hashCode,而是自己重新计算一下hashCode,而HashTable直接用对象本上的hashCode,

    并没有再进行计算。这个地方HashMap会稍慢一点HashTable。

    3.同步机制不同

    HashMap没有提供同步机制,是线程不安全的,需要自己在外面写同步代码;

    HashTable 部分方法上有自己的 synchronize 同步,是线程安全的。


    由于HashMap是线程不安全的,所以效率可能会高一点,而且在类外面控制线程安全更灵活。


    4.HashMap中没有contains方法,而在Hashtable中有一个contains方法。


    将以上不同点绘制成表格形式如下:




0 0
原创粉丝点击