容器-Map-HashMap

          1.  HashMap概要:基于哈希表Map接口的非同步實現
          • 線程不安全,線程安全請使用Hashtable
          • 效率較好
          • 提供null作為key或者value

          2.  HashMap代碼詳解
          •     默認 初始化
                           /**
               * Constructs an empty <tt>HashMap</tt> with the default initial capacity
               * (16) and the default load factor (0.75).
               
          */
              
          public HashMap() {
                  
          this.loadFactor = DEFAULT_LOAD_FACTOR;        //默認是0.75
                  threshold 
          = (int)(DEFAULT_INITIAL_CAPACITY * DEFAULT_LOAD_FACTOR);//擴容的門檻,存入的數據大于該值,容量擴充一倍
                  table 
          = new Entry[DEFAULT_INITIAL_CAPACITY];//初始化數組,數組內容為Entry,存儲鏈表    
                  init();

          • 存入元素:
          public V put(K key, V value) {
                  
          if (key == null)
                      
          return putForNullKey(value);//如果key為null,直接把value放到數組第一位table[0]
                  
          int hash = hash(key.hashCode());//通過可以的hashcode計算對應的hash值
                  
          int i = indexFor(hash, table.length);//通過hash值,把entry對應到數組的位數計算出來
                  
          for (Entry<K,V> e = table[i]; e != null; e = e.next) {//如果該entry還包含下一個entry的引用,則繼續遍歷該鏈表            
                      Object k;
          if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {//如果key相同,則替換新的value到制定的key
                          V oldValue 
          = e.value;
                          e.value 
          = value;
                          e.recordAccess(
          this);
                          
          return oldValue;
                      }
                  }

                  modCount
          ++;
                  addEntry(hash, key, value, i);
                  
          return null;
              }

          • 讀取元素:
           public V get(Object key) {
                  
          if (key == null)//key為null,直接從數組第一位拿數據
                      
          return getForNullKey();
                  
          int hash = hash(key.hashCode());
                  
          for (Entry<K,V> e = table[indexFor(hash, table.length)];  //直接通過key的hashcode計算出對應到數組的索引位,直接取數據,如果有鏈表繼續查找
                       e 
          != null;
                       e 
          = e.next) {
                      Object k;
                      
          if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
                          
          return e.value;
                  }
                  
          return null;
              }



          • 總結:
                  HashMap別的方法就不繼續詳解了,主要通過put與get可以很好的理解HashMap底層的結構,以及工作方式。








          posted on 2012-02-20 16:40 陳睿 閱讀(1070) 評論(0)  編輯  收藏 所屬分類: 高級

          導航

          <2012年2月>
          2930311234
          567891011
          12131415161718
          19202122232425
          26272829123
          45678910

          統計

          常用鏈接

          留言簿

          隨筆分類

          隨筆檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 资中县| 邯郸市| 通化市| 运城市| 沽源县| 遵义县| 环江| 乌海市| 社旗县| 巴马| 裕民县| 黄大仙区| 潍坊市| 寿宁县| 锡林浩特市| 莫力| 德阳市| 麻江县| 延安市| 河间市| 荣昌县| 昌邑市| 行唐县| 个旧市| 无锡市| 新疆| 台南市| 池州市| 左贡县| 旌德县| 剑川县| 酒泉市| 荆门市| 斗六市| 乌拉特后旗| 察哈| 柞水县| 突泉县| 安图县| 平阴县| 崇明县|