【Java】Java常見面試題(二)JAVA集合類__儲存

來源:互聯網
上載者:User
JAVA集合類圖:

1. hashmap原理,與hashtable區別 Java中的HashMap是以索引值對(key-value)的形式儲存元素的。HashMap需要一個hash函數,它使用hashCode()和equals()方法來向集合/從集合添加和檢索元素。當調用put()方法的時候,HashMap會計算key的hash值,然後把索引值對儲存在集合中合適的索引上。如果key已經存在了,value會被更新成新值。HashMap的一些重要的特性是它的容量(capacity),負載因子(load factor)和擴容極限(threshold resizing)。

附上put的源碼: [java]  view plain  copy public V put(K key, V value) {       // HashMap允許存放null鍵和null值。       // 當key為null時,調用putForNullKey方法,將value放置在數組第一個位置。       if (key == null)           return putForNullKey(value);       // 根據key的keyCode重新計算hash值。       int hash = hash(key.hashCode());       // 搜尋指定hash值在對應table中的索引。       int i = indexFor(hash, table.length);       // 如果 i 索引處的 Entry 不為 null,通過迴圈不斷遍曆 e 元素的下一個元素。       for (Entry<K,V> e = table[i]; e != null; e = e.next) {           Object k;           if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {               V oldValue = e.value;               e.value = value;               e.recordAccess(this);               return oldValue;           }       }       // 如果i索引處的Entry為null,表明此處還沒有Entry。       modCount++;      //這個mod是用於安全執行緒的,下文有講述       // 將key、value添加到i索引處。       addEntry(hash, key, value, i);       return null;   }  
addEntry:
[java]  view plain  copy void addEntry(int hash, K key, V value, int bucketIndex) {       // 擷取指定 bucketIndex 索引處的 Entry        Entry<K,V> e = table[bucketIndex];       // <strong><span style="color:#ff0000;">將新建立的 Entry 放入 bucketIndex 索引處,並讓新的 Entry 指向原來的 Entry  </span></strong>       table[bucketIndex] = new Entry<K,V>(hash, key, value, e);       // 如果 Map 中的 key-value 對的數量超過了極限       if (size++ >= threshold)       // 把 table 對象的長度擴充到原來的2倍。           resize(2 * table.length);   }  
更詳細的原理請看:  http://zhangshixi.iteye.com/blog/672697
區別:   http://blog.csdn.net/shohokuf/article/details/3932967
HashMap允許鍵和值是null,而Hashtable不允許鍵或者值是null。 Hashtable是同步的,而HashMap不是。因此,HashMap更適合於單線程環境,而Hashtable適合於多線程環境。 HashMap提供了可供應用迭代的鍵的集合,因此,HashMap是快速失敗(具體看下文)的。另一方面,Hashtable提供了對鍵的列舉(Enumeration)。 一般認為Hashtable是一個遺留的類。 2.讓hashmap變成安全執行緒的兩種方法

方法一:通過Collections.synchronizedMap()返回一個新的Map,這個新的map就是安全執行緒的. 這個要求大家習慣基於介面編程,因為返回的並不是HashMap,而是一個Map的實現.

[java]  view plain  copy

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.