Map集合常見面試題


Map集合的體系

List、Set、Map 之間的區別是什么

集合面試過程中,對於單列集合經常會被問到List和set的區別

  list集合元素有序並且集合元素可以重復

  set集合元素無序並且集合元素不允許重復

List、Set、Map 的區別主要體現在兩個⽅⾯:元素是否有序、是否允許元素重復。
三者之間的區別,如下表:

 

 

 

 

 

有可能問道你都知道哪些常用的Map集合?
  HashMap、HashTable、LinkedHashMap、ConcurrentHashMap。

 

Collection集合接口和Map接口有什么關系?
  沒關系,Collection是List、Set父接口不是Map父接口。

 

HashMap是線程安全的嗎?線程安全的Map都有哪些?性能最好的是哪個?
  HashMap不是線程安全的。線程安全的有HashTable、ConcurrentHashMap、SynchronizedMap,性能最好的是ConcurrentHashMap。

 

使用HashMap有什么性能問題嗎?
  使用HashMap要注意避免集合的擴容,它會很耗性能,根據元素的數量給它一個初始大小的值。

 

HashMap的數據結構是怎樣的?默認大小是多少?內部是怎么擴容的?
  HashMap是數組和鏈表組成的,默認大小為16,當hashmap中的元素個數超過數組大小*loadFactor(默認值為0.75)時就會把數組的大小擴展為原來的兩倍大小,然后重新計算每個元素在數組中的位置。

 

怎么按添加順序存儲元素?怎么按A-Z自然順序存儲元素?怎么自定義排序?
  按添加順序使用LinkedHashMap,按自然順序使用TreeMap,自定義排序TreeMap(Comparetor c)。

 

HashMap的鏈表結構設計是用來解決什么問題的?
  HashMap的鏈表結構設計是用來解決key的hash沖突問題的。

 

HashMap的鍵、值可以為NULL嗎?HashTable呢?
  HashMap的鍵值都可以為NULL,HashTable不行。

 

HashMap使用對象作為key,如果hashcode相同會怎么處理?

  key的hash沖突,如果key equals一致將會覆蓋值,不一致就會將值存儲在key對應的鏈表中。

 

HashMap中的get操作是什么原理?
  先根據key的hashcode值找到對應的鏈表,再循環鏈表,根據key的hash是否相同且key的==或者equals比較操作找到對應的值。

 

HashMap 和 Hashtable 有什么區別?
  存儲:HashMap 允許key 和 value 為 null,⽽ Hashtable 不允許。
  線程安全:Hashtable 是線程安全的,⽽ HashMap 是⾮線程安全的。
  推薦使⽤:在 Hashtable 的類注釋可以看到,Hashtable 是保留類不建議使⽤,推薦 在 單 線 程 環 境 下 使 ⽤ HashMap 替 代 , 如 果 需 要 多 線 程 使 ⽤ 則 ⽤ConcurrentHashMap 替代。
 
 
如何決定使⽤ HashMap 還是 TreeMap?
  對於在 Map 中插⼊、刪除、定位⼀個元素這類操作,HashMap 是最好的選擇,因為相對⽽⾔ HashMap 的插⼊會更快,但如果你要對⼀個 key 集合進⾏有序的遍歷,那TreeMap 是更好的選擇。 
 
說⼀下 HashMap 的實現原理?
  HashMap 基於 Hash 算法實現的,我們通過 put(key,value)存儲,get(key)來獲取。當傳⼊ key 時,HashMap 會根據 key. hashCode() 計算出 hash 值,根據 hash 值將value 保存在 bucket ⾥。當計算出的 hash 值相同時,我們稱之為 hash 沖突,HashMap 的做法是⽤鏈表和紅⿊樹存儲相同 hash 值的 value。當 hash 沖突的個數⽐較少時,使⽤鏈表否則使⽤紅⿊樹。
  ⾃⼰理解:兩個不同名稱的key但是計算出的hashCode值相同的數據存儲在鏈表或者紅⿊樹中。
 
 
哪些集合類是線程安全的?(可能問道)
  Vector、Hashtable、Stack 都是線程安全的,⽽像 HashMap 則是⾮線程安全的,不過在 JDK 1.5 之后隨着 Java. util. concurrent 並發包的出現,它們也有了⾃⼰對應的 線程安全類,⽐如 HashMap 對應的線程安全類就是 ConcurrentHashMap。 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM