心無(wú)痕的博客

          常用鏈接

          統(tǒng)計(jì)

          積分與排名

          JAVA技術(shù)文檔

          JAVA精典網(wǎng)站

          開(kāi)發(fā)工具

          數(shù)據(jù)庫(kù)

          最新評(píng)論

          Hashtable和HashMap的區(qū)別

          Hashtable和HashMap的區(qū)別:
          1.Hashtable是Dictionary的子類,HashMap是Map接口的一個(gè)實(shí)現(xiàn)類;
          2.Hashtable中的方法是同步的,而HashMap中的方法在缺省情況下是非同步的。即是說(shuō),在多線程應(yīng)用程序中,不用專門的操作就安全地可以使用Hashtable了;而對(duì)于HashMap,則需要額外的同步機(jī)制。但HashMap的同步問(wèn)題可通過(guò)Collections的一個(gè)靜態(tài)方法得到解決:
          Map Collections.synchronizedMap(Map m)
          這個(gè)方法返回一個(gè)同步的Map,這個(gè)Map封裝了底層的HashMap的所有方法,使得底層的HashMap即使是在多線程的環(huán)境中也是安全的。
          3.在HashMap中,null可以作為鍵,這樣的鍵只有一個(gè);可以有一個(gè)或多個(gè)鍵所對(duì)應(yīng)的值為null。當(dāng)get()方法返回null值時(shí),即可以表示HashMap中沒(méi)有該鍵,也可以表示該鍵所對(duì)應(yīng)的值為null。因此,在HashMap中不能由get()方法來(lái)判斷HashMap中是否存在某個(gè)鍵,而應(yīng)該用containsKey()方法來(lái)判斷。

          4.HashTable使用Enumeration,HashMap使用Iterator。


          以上只是表面的不同,它們的實(shí)現(xiàn)也有很大的不同。



          5.HashTable中hash數(shù)組默認(rèn)大小是11,增加的方式是 old*2+1。HashMap中hash數(shù)組的默認(rèn)大小是16,而且一定是2的指數(shù)。



          6.哈希值的使用不同,HashTable直接使用對(duì)象的hashCode,代碼是這樣的:
          int hash = key.hashCode();
          int index = (hash & 0x7FFFFFFF) % tab.length;
          而HashMap重新計(jì)算hash值,而且用與代替求模:
          int hash = hash(k);
          int i = indexFor(hash, table.length);

          static int hash(Object x) {
            int h = x.hashCode();



            h += ~(h << 9);
            h ^= (h >>> 14);
            h += (h << 4);
            h ^= (h >>> 10);
            return h;
          }
          static int indexFor(int h, int length) {
            return h & (length-1);
          }

          posted on 2008-03-09 21:41 心無(wú)痕 閱讀(571) 評(píng)論(0)  編輯  收藏 所屬分類: JAVA

          主站蜘蛛池模板: 深州市| 五大连池市| 嘉鱼县| 鹿邑县| 宁河县| 武义县| 屯昌县| 田林县| 汨罗市| 云阳县| 龙口市| 浦县| 盐城市| 无极县| 西和县| 习水县| 英德市| 武清区| 岳池县| 集安市| 泸西县| 江源县| 金乡县| 六盘水市| 鄂托克旗| 雷波县| 孟连| 乌拉特后旗| 泌阳县| 望谟县| 莎车县| 永昌县| 房产| 蒲城县| 石泉县| 万盛区| 乐平市| 禹城市| 呼伦贝尔市| 巴马| 揭东县|