﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-王胖子.奋斗();</title><link>http://www.blogjava.net/TimmyWang/</link><description>王胖子的黑板报</description><language>zh-cn</language><lastBuildDate>Mon, 13 Apr 2026 17:41:30 GMT</lastBuildDate><pubDate>Mon, 13 Apr 2026 17:41:30 GMT</pubDate><ttl>60</ttl><item><title>Hashtable和HashMap引发的血案</title><link>http://www.blogjava.net/TimmyWang/archive/2011/02/27/345291.html</link><dc:creator>王胖子</dc:creator><author>王胖子</author><pubDate>Sun, 27 Feb 2011 11:47:00 GMT</pubDate><guid>http://www.blogjava.net/TimmyWang/archive/2011/02/27/345291.html</guid><wfw:comment>http://www.blogjava.net/TimmyWang/comments/345291.html</wfw:comment><comments>http://www.blogjava.net/TimmyWang/archive/2011/02/27/345291.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.blogjava.net/TimmyWang/comments/commentRss/345291.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/TimmyWang/services/trackbacks/345291.html</trackback:ping><description><![CDATA[<span style="widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: medium Simsun; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="Apple-style-span"><span style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px" class="Apple-style-span">
<p style="margin: 0px" class="MsoNormal"><em>人物：</em></p>
<p style="text-indent: 21pt; margin: 0px" class="MsoNormal" mce_style="text-indent: 21.0pt;"><em>王小胖：性别：男。程序员，工作经验</em><em>1 year</em><em>。爱好：吃肉、电玩、马小花。特技：吃肉不用考虑胃的容量。</em></p>
<p style="text-indent: 21pt; margin: 0px" class="MsoNormal" mce_style="text-indent: 21.0pt;"><em>马小花：性别：女。学生，工作经验</em><em>0 year</em><em>。爱好：蛋糕、臭美、王小胖。特技：能够降服王小胖&#8230;&#8230;</em></p>
<p style="text-indent: 21pt; margin: 0px" class="MsoNormal" mce_style="text-indent: 21.0pt;"><em>&nbsp;</em></p>
<p style="text-indent: 21pt; margin: 0px" class="MsoNormal" mce_style="text-indent: 21.0pt;"><em>/**2011</em><em>年</em><em>2</em><em>月，电影《将爱情进行到底》火得不得了。周末，小胖也陪着小花去看这部电影。放映中，小花被影片中的靖哥哥和杜拉拉感动的一沓糊涂，而小胖则心里暗自后悔没有买一袋大爆米花来打发这无聊的时间。影片结束，小花已经是鼻涕一把泪一把，小胖也只有装模作样地抽动了几下鼻子，一心只想着一会儿是吃麦当劳还是必胜客。</em><em>*/</em></p>
<p style="text-indent: 21pt; margin: 0px" class="MsoNormal" mce_style="text-indent: 21.0pt;"><em>回到家中，小胖和小花各自玩着电脑。</em></p>
<p style="text-indent: 21pt; margin: 0px" class="MsoNormal" mce_style="text-indent: 21.0pt;"><em>小花：胖子，你知道</em><em>Hashtable</em><em>和</em><em>HashMap</em><em>的区别吗？</em></p>
<p style="text-indent: 21pt; margin: 0px" class="MsoNormal" mce_style="text-indent: 21.0pt;"><em>小胖：略知。</em></p>
<p style="text-indent: 21pt; margin: 0px" class="MsoNormal" mce_style="text-indent: 21.0pt;"><em>小花：&#8230;&#8230;装什么！！给我讲讲！！！</em></p>
<p style="text-indent: 21pt; margin: 0px" class="MsoNormal" mce_style="text-indent: 21.0pt;"><em>小胖：好的&#8230;&#8230;</em></p>
<p style="margin: 0px" class="MsoNormal"><strong>第一个区别就先来说说继承关系吧。</strong></p>
<p style="margin: 0px" class="MsoNormal">&nbsp;如果你在baidu里google一下（技术类文章的搜索还是推荐google），会发现网上的大致说法与&#8220;由于Java发展的历史原因。Hashtable是基于陈旧的Dictionary类的，HashMap是Java 1.2引进的Map接口的一个实现。&#8221;相同。这种说法没有错，但是胖子觉得不够准确，特别是对于我们这种大众菜鸟来说，如果不去深究的话，可能就会造成一些理解上的差异。简单的认为<span style="white-space: pre" mce_style="white-space: pre;">Hashtable</span>没有继承Map接口。胖子之前就犯过这样的错误（胖子承认自己笨，是真笨&#8230;&#8230;） 。</p>
<p style="margin: 0px" class="MsoNormal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<em>小花：那你怎么知道它们两个各自的继承关系呢？胖子。</em></p>
<p style="margin: 0px" class="MsoNormal">我们可以参考一下最新的JDK1.6的源码，看看这两个类的定义：</p>
<p style="margin: 0px" class="MsoNormal"><br />
</p>
<pre style="border-bottom: rgb(204,204,204) 1px solid; border-left: rgb(204,204,204) 1px solid; padding-bottom: 3px; background-color: rgb(250,250,250); margin: 0px 5px 5px 15px; padding-left: 3px; padding-right: 3px; font-family: Verdana, Arial, Helvetica, sans-serif; color: rgb(0,0,0); font-size: 12px; border-top: rgb(204,204,204) 1px solid; border-right: rgb(204,204,204) 1px solid; padding-top: 3px; background-origin: initial; background-clip: initial" class="java" name="code">public class Hashtable&lt;K,V&gt;
extends Dictionary&lt;K,V&gt;
implements Map&lt;K,V&gt;, Cloneable, java.io.Serializable {&#8230;}
public class HashMap&lt;K,V&gt;
extends AbstractMap&lt;K,V&gt;
implements Map&lt;K,V&gt;, Cloneable, Serializable {&#8230;}</pre>
<p style="margin: 0px"><br />
</p>
<p style="margin: 0px"><br />
</p>
<p style="margin: 0px" class="MsoNormal">可以看到hashtable也是继承了Map接口。它们的不同是Hashtable（since JDK1.0）就继承了Dictionary这个抽象类，而HashMap（since JDK1.2）继承的则是AbstractMap这个抽象类。因为在Hashtable中看到继承Map后所实现的方法是JDK1.2版本时加上去的，所以胖子猜想可能是在JDK 1.2开发时Sun工程师出于统一的考虑使得Hashtable也继承了Map接口。</p>
<p style="margin: 0px" class="MsoNormal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<em>小花：哦，原来</em><em>JDK</em><em>源码还能看出来这个。</em></p>
<p style="margin: 0px" class="MsoNormal"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</em><em>小胖：&#8230;&#8230;后面还能看出更多东西的。</em></p>
<p style="margin: 0px" class="MsoNormal"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</em><em>小花：好期待啊。</em></p>
<p style="margin: 0px" class="MsoNormal"><br />
</p>
<p style="margin: 0px" class="MsoNormal"><strong>第二个区别我们从同步和并发性上来说说它们两个的不同。</strong></p>
<p style="margin: 0px" class="MsoNormal"><br />
</p>
<p style="margin: 0px" class="MsoNormal">可以通过这两个类得源码来分析，Hashtable中的主要方法都做了同步处理，而HashMap则没有。可以说Hashtable在默认情况支持同步，而HashMap在默认情况下是不支持的。我们在多线程并发的环境下，可以直接使用Hashtable，但是要使用HashMap的话就要自己增加同步处理了。对HashMap的同步处理可以使用Collections类提供的synchronizedMap静态方法；或者直接使用JDK5.0之后提供的java.util.concurrent包里的ConcurrentHashMap类。</p>
<p style="text-indent: 21pt; margin: 0px" class="MsoNormal" mce_style="text-indent: 21.0pt;"><em>小胖：</em><em>synchronizedMap</em><em>静态方法和</em><em>ConcurrentHashMap</em><em>类我会以后再给你详细讲一下的。肥婆。</em></p>
<p style="text-indent: 21pt; margin: 0px" class="MsoNormal" mce_style="text-indent: 21.0pt;"><em>小花：你保证啊。钥匙忘了你知道后果的。</em></p>
<p style="text-indent: 21pt; margin: 0px" class="MsoNormal" mce_style="text-indent: 21.0pt;"><em>小胖：好的&#8230;&#8230;</em></p>
<p style="text-indent: 21pt; margin: 0px" class="MsoNormal" mce_style="text-indent: 21.0pt;"><br />
</p>
<p style="text-indent: 21pt; margin: 0px" class="MsoNormal" mce_style="text-indent: 21.0pt;"><strong>第三个区别就是它们对于</strong><strong>null</strong><strong>值的处理方式了。</strong></p>
<p style="text-indent: 21pt; margin: 0px" class="MsoNormal" mce_style="text-indent: 21pt;"><br />
</p>
<p style="text-indent: 21pt; margin: 0px" class="MsoNormal" mce_style="text-indent: 21.0pt;">我们依然能够从源代码中得知，Hashtable中，key和value都不允许出现null值。</p>
<p style="text-indent: 21pt; margin: 0px" class="MsoNormal" mce_style="text-indent: 21.0pt;"><br />
</p>
<pre style="border-bottom: rgb(204,204,204) 1px solid; border-left: rgb(204,204,204) 1px solid; padding-bottom: 3px; background-color: rgb(250,250,250); margin: 0px 5px 5px 15px; padding-left: 3px; padding-right: 3px; font-family: Verdana, Arial, Helvetica, sans-serif; color: rgb(0,0,0); font-size: 12px; border-top: rgb(204,204,204) 1px solid; border-right: rgb(204,204,204) 1px solid; padding-top: 3px; background-origin: initial; background-clip: initial" class="java" name="code">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 &amp; 0x7FFFFFFF) % tab.length;
//&#8230;
}</pre>
&nbsp;&nbsp;
<p style="margin: 0px" class="MsoNormal">在我们使用上面的方法时，如参数value为null，可以从代码<span style="font-size: small" mce_style="font-size: small;">中直接看出程序会抛出NullPointerException；而在key为null时，则会在&#8220;int hash = key.hashCode();&#8220;这段计算Hash值的过程中抛出NullPointerException。</span>而在在HashMap中，允许null作为key存在，并且和其他key的特性一样，这样的null值key只能有一个；另外HashMap允许多个value为null。这样大家就要注意了，&nbsp;HashMap中就不能用get(key)方法来判断HashMap中是否存在某个key，因为value为null和不存在该key的Entry都会返回null值，而应该用containsKey()方法来判断了。</p>
<p style="text-indent: 21pt; margin: 0px" class="MsoNormal" mce_style="text-indent: 21.0pt;"><br />
</p>
<pre style="border-bottom: rgb(204,204,204) 1px solid; border-left: rgb(204,204,204) 1px solid; padding-bottom: 3px; background-color: rgb(250,250,250); margin: 0px 5px 5px 15px; padding-left: 3px; padding-right: 3px; font-family: Verdana, Arial, Helvetica, sans-serif; color: rgb(0,0,0); font-size: 12px; border-top: rgb(204,204,204) 1px solid; border-right: rgb(204,204,204) 1px solid; padding-top: 3px; background-origin: initial; background-clip: initial" class="java" name="code">import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
public class TestCase {
public static void main(String[] args) {
Map&lt;Integer,String&gt; hashMap = new HashMap&lt;Integer,String&gt;();
hashMap.put(0, null);
hashMap.put(1, "one");
hashMap.put(2, "two");
hashMap.put(null, "null");
for(Entry&lt;Integer, String&gt; e : hashMap.entrySet()) {
System.out.println("Key: " + e.getKey() + " -- Value: " + e.getValue());
}
System.out.println(hashMap.get(0));
System.out.println(hashMap.get(4));
System.out.println("Contains key 0 ? :" + hashMap.containsKey(0));
System.out.println("Contains key 4 ? :" + hashMap.containsKey(4));
System.out.println("Contains value null ? :" + hashMap.containsValue(null));
}
}</pre>
&nbsp;
<p style="margin: 0px"><span style="font-family: 'Courier New'; font-size: small" mce_style="font-family: 'Courier New'; font-size: small;"><span style="font-size: 13px" mce_style="font-size: 13px;"><span style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: small" mce_style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: small;"><span style="font-size: 12px" mce_style="font-size: 12px;">结果：</span></span></span></span></p>
<p style="text-align: left; margin: 0px" class="MsoNormal" align="left" mce_style="text-align: left;"><br />
</p>
<pre style="border-bottom: rgb(204,204,204) 1px solid; border-left: rgb(204,204,204) 1px solid; padding-bottom: 3px; background-color: rgb(250,250,250); margin: 0px 5px 5px 15px; padding-left: 3px; padding-right: 3px; font-family: Verdana, Arial, Helvetica, sans-serif; color: rgb(0,0,0); font-size: 12px; border-top: rgb(204,204,204) 1px solid; border-right: rgb(204,204,204) 1px solid; padding-top: 3px; background-origin: initial; background-clip: initial" class="java" name="code">Key: null -- Value: null
Key: 0 -- Value: null
Key: 1 -- Value: one
Key: 2 -- Value: two
null
null
Contains key 0 ? :true
Contains key 4 ? :false
Contains value null ? :true</pre>
<p style="margin: 0px"><br />
</p>
<p style="margin: 0px" class="MsoNormal">HashMap对于null值key的处理网上有说&#8220;null&nbsp;用new Object()来代替，其Entry.hashCode=0,而且在取出的时候还会还回null的。&#8221;胖子我在读取源码的过程中看到了null值的hash值确实是0&nbsp;（内部实现的数组中的index也是），但是能力有限没有看到转为new Object()的过程。</p>
<p style="text-align: left; margin: 0px" class="MsoNormal" align="left" mce_style="text-align: left;"><em>小花： 原来</em><em>hashMap</em><em>的</em><em>containsKey</em><em>还有这么个陷阱，以后肥婆要小心了。</em></p>
<p style="text-align: left; margin: 0px" class="MsoNormal" align="left" mce_style="text-align: left;"><strong>第四个不同就是它们两个</strong><strong>Hash</strong><strong>值的获取方式了。</strong></p>
<p style="text-align: left; margin: 0px" class="MsoNormal" align="left" mce_style="text-align: left;"><br />
</p>
<p style="text-align: left; margin: 0px" class="MsoNormal" align="left" mce_style="text-align: left;">还是通过源代码源代码，Hashtable是直接使用key对象的hash值。</p>
<p style="text-align: left; margin: 0px" class="MsoNormal" align="left" mce_style="text-align: left;"><br />
</p>
<p style="text-align: left; margin: 0px" class="MsoNormal" align="left" mce_style="text-align: left;"><br />
</p>
<pre style="border-bottom: rgb(204,204,204) 1px solid; border-left: rgb(204,204,204) 1px solid; padding-bottom: 3px; background-color: rgb(250,250,250); margin: 0px 5px 5px 15px; padding-left: 3px; padding-right: 3px; font-family: Verdana, Arial, Helvetica, sans-serif; color: rgb(0,0,0); font-size: 12px; border-top: rgb(204,204,204) 1px solid; border-right: rgb(204,204,204) 1px solid; padding-top: 3px; background-origin: initial; background-clip: initial" class="java" name="code">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();//hashcode
int index = (hash &amp; 0x7FFFFFFF) % tab.length;
//&#8230;
}</pre>
&nbsp;
<p style="margin: 0px"><br />
</p>
<p style="text-align: left; margin: 0px" class="MsoNormal" align="left" mce_style="text-align: left;">而HashMap则是利用key对象的hash值重新计算一个新的hash值。</p>
<p style="text-align: left; margin: 0px" class="MsoNormal" align="left" mce_style="text-align: left;"><br />
</p>
<p style="text-align: left; margin: 0px" class="MsoNormal" align="left" mce_style="text-align: left;"><br />
</p>
<pre style="border-bottom: rgb(204,204,204) 1px solid; border-left: rgb(204,204,204) 1px solid; padding-bottom: 3px; background-color: rgb(250,250,250); margin: 0px 5px 5px 15px; padding-left: 3px; padding-right: 3px; font-family: Verdana, Arial, Helvetica, sans-serif; color: rgb(0,0,0); font-size: 12px; border-top: rgb(204,204,204) 1px solid; border-right: rgb(204,204,204) 1px solid; padding-top: 3px; background-origin: initial; background-clip: initial" class="java" name="code">public V put(K key, V value) {
if (key == null)
return putForNullKey(value);
int hash = hash(key.hashCode());//hashcode
int i = indexFor(hash, table.length);
//&#8230;
}
static int hash(int h) {
h ^= (h &gt;&gt;&gt; 20) ^ (h &gt;&gt;&gt; 12);
return h ^ (h &gt;&gt;&gt; 7) ^ (h &gt;&gt;&gt; 4);
}</pre>
<p style="margin: 0px"><br />
</p>
<p style="text-align: left; margin: 0px" class="MsoNormal" align="left" mce_style="text-align: left;"><em>小花：胖子，都用了</em><em>hash</em><em>算法，你给我讲讲</em><em>Hash</em><em>算法吧。</em></p>
<p style="text-align: left; margin: 0px" class="MsoNormal" align="left" mce_style="text-align: left;"><em>小胖：嗯&#8230;&#8230;以后的，今天我比较忙（其实是不会）。</em></p>
<p style="text-align: left; margin: 0px" class="MsoNormal" align="left" mce_style="text-align: left;"><em>小花：你是不是不会啊？嘿嘿（坏笑）。</em></p>
<p style="text-align: left; margin: 0px" class="MsoNormal" align="left" mce_style="text-align: left;"><em>小胖：什么不会&#8230;&#8230;谈下一话题&#8230;&#8230;</em></p>
<p style="text-align: left; margin: 0px" class="MsoNormal" align="left" mce_style="text-align: left;"><em>&nbsp;</em></p>
<p style="text-align: left; margin: 0px" class="MsoNormal" align="left" mce_style="text-align: left;"><strong>第五个不同就是</strong><strong>Hashtable</strong><strong>和</strong><strong>HashMap</strong><strong>它们两个内部实现方式的数组的初始大小和扩容的方式。</strong></p>
<p style="text-align: left; margin: 0px" class="MsoNormal" align="left" mce_style="text-align: left;"><br />
</p>
<p style="margin: 0px" class="MsoNormal">HashMap中内部数组的初始容量是16， 加载因子为0.75，而且数组容量增容后也要是2指数次幂：</p>
<p style="margin: 0px" class="MsoNormal"><br />
</p>
<p style="margin: 0px" class="MsoNormal"><br />
</p>
<pre style="border-bottom: rgb(204,204,204) 1px solid; border-left: rgb(204,204,204) 1px solid; padding-bottom: 3px; background-color: rgb(250,250,250); margin: 0px 5px 5px 15px; padding-left: 3px; padding-right: 3px; font-family: Verdana, Arial, Helvetica, sans-serif; color: rgb(0,0,0); font-size: 12px; border-top: rgb(204,204,204) 1px solid; border-right: rgb(204,204,204) 1px solid; padding-top: 3px; background-origin: initial; background-clip: initial" class="java" name="code">/**
* The default initial capacity - MUST be a power of two.
*/
static final int DEFAULT_INITIAL_CAPACITY = 16;
/**
* The load factor used when none specified in constructor.
*/
static final float DEFAULT_LOAD_FACTOR = 0.75f;</pre>
&nbsp;
<p style="margin: 0px"><br />
</p>
<p style="margin: 0px" class="MsoNormal">HashTable中的内部数组的初始容量是11，加载因子也是0.75数组的增容方式为（oldCapacity * 2 + 1）:</p>
<p style="margin: 0px" class="MsoNormal"><br />
</p>
<p style="margin: 0px" class="MsoNormal"><br />
</p>
<pre style="border-bottom: rgb(204,204,204) 1px solid; border-left: rgb(204,204,204) 1px solid; padding-bottom: 3px; background-color: rgb(250,250,250); margin: 0px 5px 5px 15px; padding-left: 3px; padding-right: 3px; font-family: Verdana, Arial, Helvetica, sans-serif; color: rgb(0,0,0); font-size: 12px; border-top: rgb(204,204,204) 1px solid; border-right: rgb(204,204,204) 1px solid; padding-top: 3px; background-origin: initial; background-clip: initial" class="java" name="code">public Hashtable() {
this(11, 0.75f);
}
protected void rehash() {
int oldCapacity = table.length;
Entry[] oldMap = table;
int newCapacity = oldCapacity * 2 + 1;
//&#8230;
}</pre>
&nbsp;
<p style="margin: 0px"><br />
</p>
<p style="text-align: left; margin: 0px" class="MsoNormal" align="left" mce_style="text-align: left;"><strong>第六个不同我们从它们两个遍历方式的内部实现上来说。</strong></p>
<p style="margin: 0px" class="MsoNormal">Hashtable HashMap都使用了&nbsp;Iterator。而由于历史原因，Hashtable还使用了Enumeration的方式 。</p>
<p style="text-align: left; margin: 0px" class="MsoNormal" align="left" mce_style="text-align: left;"><em>小花：</em><em>Iterator</em><em>和</em><em>Enumeration</em><em>的区别是什么啊？给我讲讲。</em></p>
<p style="text-align: left; margin: 0px" class="MsoNormal" align="left" mce_style="text-align: left;"><em>小胖：我不是说我没有时间嘛，下回的。</em></p>
<p style="text-align: left; margin: 0px" class="MsoNormal" align="left" mce_style="text-align: left;"><em>小花：我都记下来，省得你给我混过去。（拿起笔开始记账中）</em></p>
<p style="text-align: left; margin: 0px" class="MsoNormal" align="left" mce_style="text-align: left;"><em>小胖：&#8230;&#8230;（紧张）</em></p>
<p style="text-align: left; margin: 0px" class="MsoNormal" align="left" mce_style="text-align: left;"><strong>第七个不同时它们的拷贝构造函数的不同。</strong></p>
<p style="text-align: left; margin: 0px" class="MsoNormal" align="left" mce_style="text-align: left;"><br />
</p>
<p style="text-align: left; margin: 0px" class="MsoNormal" align="left" mce_style="text-align: left;">依然是通过查看源码，可以发现它们两个对于拷贝函数初始容量的不同值。</p>
<p style="text-align: left; margin: 0px" class="MsoNormal" align="left" mce_style="text-align: left;">HashMap的实现是：</p>
<p style="text-align: left; margin: 0px" class="MsoNormal" align="left" mce_style="text-align: left;"><br />
</p>
<p style="text-align: left; margin: 0px" class="MsoNormal" align="left" mce_style="text-align: left;"><br />
</p>
<pre style="border-bottom: rgb(204,204,204) 1px solid; border-left: rgb(204,204,204) 1px solid; padding-bottom: 3px; background-color: rgb(250,250,250); margin: 0px 5px 5px 15px; padding-left: 3px; padding-right: 3px; font-family: Verdana, Arial, Helvetica, sans-serif; color: rgb(0,0,0); font-size: 12px; border-top: rgb(204,204,204) 1px solid; border-right: rgb(204,204,204) 1px solid; padding-top: 3px; background-origin: initial; background-clip: initial" class="java" name="code">public HashMap(Map&lt;? extends K, ? extends V&gt; m) {
this(Math.max((int) (m.size() / DEFAULT_LOAD_FACTOR) + 1,
DEFAULT_INITIAL_CAPACITY), DEFAULT_LOAD_FACTOR);
putAllForCreate(m);
}</pre>
&nbsp;
<p style="margin: 0px"><br />
</p>
<p style="text-align: left; margin: 0px" class="MsoNormal" align="left" mce_style="text-align: left;">而Hashtable的实现是：</p>
<p style="text-align: left; margin: 0px" class="MsoNormal" align="left" mce_style="text-align: left;"><br />
</p>
<p style="text-align: left; margin: 0px" class="MsoNormal" align="left" mce_style="text-align: left;"><br />
</p>
<pre style="border-bottom: rgb(204,204,204) 1px solid; border-left: rgb(204,204,204) 1px solid; padding-bottom: 3px; background-color: rgb(250,250,250); margin: 0px 5px 5px 15px; padding-left: 3px; padding-right: 3px; font-family: Verdana, Arial, Helvetica, sans-serif; color: rgb(0,0,0); font-size: 12px; border-top: rgb(204,204,204) 1px solid; border-right: rgb(204,204,204) 1px solid; padding-top: 3px; background-origin: initial; background-clip: initial" class="java" name="code">public Hashtable(Map&lt;? extends K, ? extends V&gt; t) {
this(Math.max(2*t.size(), 11), 0.75f);
putAll(t);
}</pre>
&nbsp;
<p style="margin: 0px"><br />
</p>
<p style="text-align: left; margin: 0px" class="MsoNormal" align="left" mce_style="text-align: left;"><br />
</p>
<p style="text-align: left; margin: 0px" class="MsoNormal" align="left" mce_style="text-align: left;"><em>小胖：今天讲的已经很多了。我有点饿了，肥婆。</em></p>
<p style="text-align: left; margin: 0px" class="MsoNormal" align="left" mce_style="text-align: left;"><em>小花：看你今天的表现这么好。走，带你去吃烤肉去。</em></p>
<p style="text-align: left; margin: 0px" class="MsoNormal" align="left" mce_style="text-align: left;"><em>小胖：哈哈，肥婆万岁。</em></p>
<p style="text-align: left; margin: 0px" class="MsoNormal" align="left" mce_style="text-align: left;"><br />
</p>
<p style="text-align: left; margin: 0px" class="MsoNormal" align="left" mce_style="text-align: left;">PS:下面打算写的一些东西</p>
<p style="text-align: left; margin: 0px" class="MsoNormal" align="left" mce_style="text-align: left;"><br />
</p>
<p style="margin: 0px" class="MsoNormal"><br />
</p>
<ol>
    <li>TreeMap的排序及其他相关集合类</li>
    <li>synchronizedMap的使用方式</li>
    <li>concurrentMap实现细节和使用</li>
    <li>Properties使用说明和&nbsp;扩展</li>
    <li>Iterator和Enumeration的区别</li>
    <li>Hash算法 的实现&nbsp;</li>
</ol>
</span></span>
      <img src ="http://www.blogjava.net/TimmyWang/aggbug/345291.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/TimmyWang/" target="_blank">王胖子</a> 2011-02-27 19:47 <a href="http://www.blogjava.net/TimmyWang/archive/2011/02/27/345291.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>