Terry.Li-彬

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

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            143 隨筆 :: 344 文章 :: 130 評論 :: 0 Trackbacks
          <2007年11月>
          28293031123
          45678910
          11121314151617
          18192021222324
          2526272829301
          2345678

          常用鏈接

          留言簿(19)

          隨筆分類(107)

          隨筆檔案(141)

          文章分類(284)

          文章檔案(342)

          相冊

          收藏夾(58)

          家裝

          最新隨筆

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          HashMap / HashTable / HashSet

          HashTable 與 HashMap:
           
                    表面:
                            HashTable不允許null(keyvalue都不可以),HashMap允許null(keyvalue都可以)
                    HashTable的方法是同步的,HashMap未經同步,所以在多線程場合要手動同步HashMap這個區別就像VectorArrayList一樣。
                    HashTable有一個contains(Object value),功能和containsValue(Object value)功能一樣。
                    HashTable使用EnumerationHashMap使用Iterator
             
                內部:
                    HashTablehash數組默認大小是11,增加的方式是 old*2+1HashMaphash數組的默認大小是16,而且一定是2的指數。
                   
                    哈希值的使用不同,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可以看作三個視圖:keySetvalueCollectionEntrySet這里HashSet就是其實就是HashMap的一個視圖。HashSet內部就是使用Hashmap實現的,和Hashmap不同的是它不需要KeyValue兩個值。
                  

                  往hashset中插入對象其實只不過是內部做了

                        public boolean add(Object o) {

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

                  往hashset中插入對象其實只不過是內部做了

                        public boolean add(Object o) {

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

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

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


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

          評論

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

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

          對于性能不僅與數量還和質量 戰略 運氣有關 運氣其實是沒有考慮人為因素的帶來的隨機性  回復  更多評論
            


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

          網站導航:
          博客園   IT新聞   Chat2DB   C++博客   博問  
           
          主站蜘蛛池模板: 清苑县| 涿州市| 陕西省| 光山县| 九寨沟县| 武威市| 延川县| 浪卡子县| 祁阳县| 黔西| 枝江市| 永寿县| 德昌县| 普安县| 六枝特区| 潮安县| 新丰县| 马尔康县| 台前县| 醴陵市| 怀远县| 公主岭市| 汾西县| 科技| 西充县| 安丘市| 高碑店市| 伊吾县| 霍山县| 腾冲县| 和林格尔县| 台北市| 株洲市| 商南县| 汪清县| 长沙市| 宜州市| 广汉市| 道孚县| 仁怀市| 琼结县|