码迷,mamicode.com
首页 > 其他好文 > 详细

HashMap和HashTable的区别

时间:2016-08-07 17:04:32      阅读:121      评论:0      收藏:0      [点我收藏+]

标签:

  今天刷题,突然看到HashMap和HashTable的区别是。。。。,我记得也不太清楚了,就好好整理一下吧。

先说相同点:

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

    技术分享

 

不同点:

  一: HashMap可以允许key为null,value为null,HashTable都不允许为null,贴出来jdk8的HashTable的部分源码:

 1     public synchronized V put(K key, V value) {
 2         // Make sure the value is not null
 3         if (value == null) {
 4             throw new NullPointerException();
 5         }
 6 
 7         // Makes sure the key is not already in the hashtable.
 8         Entry<?,?> tab[] = table;
 9         int hash = key.hashCode();
10         int index = (hash & 0x7FFFFFFF) % tab.length;
11         @SuppressWarnings("unchecked")
12         Entry<K,V> entry = (Entry<K,V>)tab[index];
13         for(; entry != null ; entry = entry.next) {
14             if ((entry.hash == hash) && entry.key.equals(key)) {
15                 V old = entry.value;
16                 entry.value = value;
17                 return old;
18             }
19         }
20 
21         addEntry(hash, key, value, index);
22         return null;
23     }

  可以看到第4行判断了 value 是否为null,那么key是否为null在哪判断的呢?

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

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

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

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

 

  二: 继承的类不一样

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

 

  

  三: 同步机制不一样

    HashMap没有提供同步机制,是线程不安全的,需要自己在外面写同步代码,HashTable 部分方法上有自己的 synchronize 同步,是线程安全的。

      这是HashTable的put方法。

    技术分享

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

 

  四: HashMap中没有contains()方法。

 

  五: 它们的数组初始化大小和扩容方式不一样,HashTable中hash数组默认大小是11,增加的方式是 old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。 

 

HashMap和HashTable的区别

标签:

原文地址:http://www.cnblogs.com/wuqinglong/p/5746473.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!