HashMap 和 Hashtable


    学习过程中,遇到了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方法。


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




评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值