天天看点

Hashtable 与HashMap的区别

1、不同点:

    (1)、Hashtable书写不规范,t是小写(当然这不是重点,哈哈),

    (2)、Hashtable继承自Dictionary,而HashMap继承自AbstractMap。

    (3)、Hashtable是JDK1.0时就有的,而HashMap是在JKD1.2时才出现的。

可看两个类的定义:

<code> </code><code>* </code><code>@since</code> <code>JDK1.</code><code>0</code>

<code> </code><code>*/</code>

<code>public</code> <code>class</code> <code>Hashtable&lt;K,V&gt;</code>

<code>    </code><code>extends</code> <code>Dictionary&lt;K,V&gt;</code>

<code>    </code><code>implements</code> <code>Map&lt;K,V&gt;, Cloneable, java.io.Serializable {</code>

<code> </code><code>* </code><code>@since</code>   <code>1.2</code>

<code>public</code> <code>class</code> <code>HashMap&lt;K,V&gt;</code>

<code>    </code><code>extends</code> <code>AbstractMap&lt;K,V&gt;</code>

<code>    </code><code>implements</code> <code>Map&lt;K,V&gt;, Cloneable, Serializable</code>

<code>{</code>

2、Hashtable的put方法中key和value都不允许为null,而HashMap的put方法中key和value允许为null。

3、Hashtable是线程安全的,效率低,HashMap是线程不安全的,效率高。

以上两点可通过如下Hashtable和HashMap的put方法的源码得知:

Hashtable的put方法:

<code>  </code><code>public</code> <code>synchronized V put(K key, V value) { </code><code>//1、方法是同步的</code>

<code>        </code><code>// Make sure the value is not null</code>

<code>        </code><code>if</code> <code>(value == </code><code>null</code><code>) { </code><code>//2、value不能为null</code>

<code>            </code><code>throw</code> <code>new</code> <code>NullPointerException();</code>

<code>        </code><code>}</code>

<code>        </code><code>// Makes sure the key is not already in the hashtable.</code>

<code>        </code><code>Entry tab[] = table;</code>

<code>        </code><code>int</code> <code>hash = hash(key);</code><code>//3、看如下hash(key);</code>

<code>        </code><code>int</code> <code>index = (hash &amp; </code><code>0x7FFFFFFF</code><code>) % tab.length;</code>

<code>        </code><code>for</code> <code>(Entry&lt;K,V&gt; e = tab[index] ; e != </code><code>null</code> <code>; e = e.next) {</code>

<code>            </code><code>if</code> <code>((e.hash == hash) &amp;&amp; e.key.equals(key)) {</code>

<code>                </code><code>V old = e.value;</code>

<code>                </code><code>e.value = value;</code>

<code>                </code><code>return</code> <code>old;</code>

<code>            </code><code>}</code>

<code>---------------------------------------------------------------------</code>

<code>    </code><code>private</code> <code>int</code> <code>hash(</code><code>Object</code> <code>k) {</code>

<code>        </code><code>// hashSeed will be zero if alternative hashing is disabled.</code>

<code>        </code><code>return</code> <code>hashSeed ^ k.hashCode();</code><code>//key也是不能为null的,不然会抛空指针异常。</code>

<code>    </code><code>}</code>

HashMap的put方法:

<code>    </code><code>public</code> <code>V put(K key, V value) { </code><code>//1、方法是不同步的</code>

<code>        </code><code>if</code> <code>(table == EMPTY_TABLE) {</code>

<code>            </code><code>inflateTable(threshold);</code>

<code>        </code><code>if</code> <code>(key == </code><code>null</code><code>)</code>

<code>            </code><code>return</code> <code>putForNullKey(value);</code><code>//2、key可以为null</code>

<code>        </code><code>int</code> <code>hash = hash(key);</code>

<code>        </code><code>int</code> <code>i = indexFor(hash, table.length);</code>

<code>        </code><code>for</code> <code>(Entry&lt;K,V&gt; e = table[i]; e != </code><code>null</code><code>; e = e.next) {</code>

<code>            </code><code>Object k;</code>

<code>            </code><code>if</code> <code>(e.hash == hash &amp;&amp; ((k = e.key) == key || key.equals(k))) {</code>

<code>                </code><code>V oldValue = e.value;</code>

<code>                </code><code>e.recordAccess(</code><code>this</code><code>);</code>

<code>                </code><code>return</code> <code>oldValue;</code>

<code>        </code> 

<code>        </code><code>modCount++;</code>

<code>        </code><code>//3、方法并没有对value进行任何调用,所以value可以为null</code>

<code>        </code><code>addEntry(hash, key, value, i);</code>

<code>        </code><code>return</code> <code>null</code><code>;</code>

4、Hashtable 有一个 contains方法,容易引起误会,所以在HashMap里面已经去掉了。当然,2个类都有containsKey和containsValue方法。

==========================================================================================

总结:

    (1)、Hashtable书写不规范,t是小写(当然这不是重点),

本文转自 兴趣e族 51CTO博客,原文链接:http://blog.51cto.com/simplelife/1860192

继续阅读