Terry.Li-彬

          虛其心,可解天下之問;專其心,可治天下之學;靜其心,可悟天下之理;恒其心,可成天下之業(yè)。

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            143 隨筆 :: 344 文章 :: 130 評論 :: 0 Trackbacks

          HashMap / HashTable / HashSet

          HashTable 與 HashMap:
           
                    表面:
                            HashTable不允許null(keyvalue都不可以),HashMap允許null(keyvalue都可以)。
                    HashTable的方法是同步的,HashMap未經(jīng)同步,所以在多線程場合要手動同步HashMap這個區(qū)別就像VectorArrayList一樣。
                    HashTable有一個contains(Object value),功能和containsValue(Object value)功能一樣。
                    HashTable使用Enumeration,HashMap使用Iterator。
             
                內(nèi)部:
                    HashTablehash數(shù)組默認大小是11,增加的方式是 old*2+1。HashMaphash數(shù)組的默認大小是16,而且一定是2的指數(shù)。
                   
                    哈希值的使用不同,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);
                          }

            HashSet 、 HashMap:

                     HashMap可以看作三個視圖:keySetvalueCollection,EntrySet。這里HashSet就是其實就是HashMap的一個視圖。HashSet內(nèi)部就是使用Hashmap實現(xiàn)的,和Hashmap不同的是它不需要KeyValue兩個值。
                  

                  往hashset中插入對象其實只不過是內(nèi)部做了

                        public boolean add(Object o) {

                              return map.put(o, PRESENT)==null;
                       
          }

                  往hashset中插入對象其實只不過是內(nèi)部做了

                        public boolean add(Object o) {

                              return map.put(o, PRESENT)==null;
                       
          }

                      
               HashMap為散列映射,它是基于hash table的一個實現(xiàn),它可在常量時間內(nèi)安插元素,或找出一組key-value pair.

               HashSet為散列集,它把查找時間看的很重要,其中所有元素必須要有hashCode()


          posted on 2007-11-24 15:07 禮物 閱讀(4919) 評論(2)  編輯  收藏

          評論

          # re: HashMap 、HashTable、HashSet的區(qū)別 2008-09-17 22:30 地方
          我是外行 看不懂  回復(fù)  更多評論
            

          # re: HashMap 、HashTable、HashSet的區(qū)別 [未登錄] 2010-06-03 10:51
          還是應(yīng)該帶著問題去思考比較好。因為人之間總有共性,能夠思考同樣的事情.雖然有的觀察不到,但是事物之間確實有聯(lián)系。

          對于性能不僅與數(shù)量還和質(zhì)量 戰(zhàn)略 運氣有關(guān) 運氣其實是沒有考慮人為因素的帶來的隨機性  回復(fù)  更多評論
            


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

          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 大冶市| 望城县| 乌海市| 剑阁县| 兴海县| 财经| 梅河口市| 宜良县| 大厂| 古交市| 蒙城县| 马山县| 敦煌市| 酒泉市| 额尔古纳市| 尼玛县| 金川县| 海口市| 津市市| 黎川县| 宜黄县| 杭锦旗| 基隆市| 琼海市| 金门县| 东港市| 木里| 吴川市| 铜山县| 蒲城县| 金山区| 珠海市| 辽阳市| 阳谷县| 安龙县| 黑山县| 上杭县| 绥宁县| 巴塘县| 绵阳市| 三穗县|