posts - 19, comments - 1, trackbacks - 0, articles - 0
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          HashMap與Hashtable的區(qū)別

          Posted on 2006-09-30 21:44 xyang 閱讀(927) 評論(0)  編輯  收藏
          HashTable的應(yīng)用非常廣泛,HashMap是新框架中用來代替HashTable的類,也就是說建議使用HashMap,不要使用HashTable。可能你覺得HashTable很好用,為什么不用呢?這里簡單分析他們的區(qū)別。?
          1.HashTable的方法是同步的,HashMap未經(jīng)同步,所以在多線程場合要手動同步HashMap這個區(qū)別就像Vector和ArrayList一樣。

          2.HashTable不允許null值(key和value都不可以),HashMap允許null值(key和value都可以)。

          3.HashTable有一個contains(Object?value),功能和containsValue(Object?value)功能一樣。

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

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

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

          6.哈希值的使用不同,HashTable直接使用對象的hashCode,代碼是這樣的:
          int?hash?=?key.hashCode();
          int?index?=?(hash?&?0x7FFFFFFF)?%?tab.length;
          而HashMap重新計算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);
          }
          以上只是一些比較突出的區(qū)別,當(dāng)然他們的實現(xiàn)上還是有很多不同的,比如
          HashMap對null的操作

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 盐池县| 青川县| 鹤山市| 白山市| 宣城市| 碌曲县| 昌宁县| 蒙阴县| 北京市| 永州市| 从江县| 科技| 海城市| 衢州市| 烟台市| 沂水县| 闽侯县| 临武县| 大埔区| 玉田县| 威海市| 丹寨县| 本溪市| 比如县| 池州市| 琼海市| 平乐县| 万载县| 彰武县| 内黄县| 宁强县| 临猗县| 松阳县| 昌都县| 疏勒县| 固安县| 浑源县| 浙江省| 遵义县| 盐亭县| 南阳市|