java面試總結(二)-集合類

java面試總結(二)

第二部分-集合類
1概述
集合框架分爲兩部分:Collection(Set、List)和Map。(無序、唯一)
按照體系進行劃分,集合類型可以分爲三類:集(Set)列表(List)、映射(Map)。
在這裏插入圖片描述

1.1 Set
集合中不允許出現重複的元素;集合不區分元素順序。
Set集合主要包括:HashSet、LinkedHashSet、TreeSet。
**HashSet:**此類實現 Set 接口,由哈希表(實際上是一個 HashMap 實例)支持。它不保證 set 的迭代順序;特別是它不保證該順序恆久不變。此類允許使用 null 元素。
注意,此實現不是同步的。如果多個線程同時訪問一個哈希 set,而其中至少一個線程修改了該 set,那麼它必須 保持外部同步。
HashSet底層數據結構是哈希表(HashMap),哈希表依賴於哈希值存儲,添加功能底層依賴兩個方法:int hashCode(),boolean equals(Object obj)。
LinkedHashSet:具有可預知迭代順序的 Set 接口的哈希表和鏈接列表實現。此實現與 HashSet 的不同之外在於,後者維護着一個運行於所有條目的雙重鏈接列表。此鏈接列表定義了迭代順序,即按照將元素插入到 set 中的順序(插入順序)進行迭代。注意,插入順序不 受在 set 中重新插入的 元素的影響。
哈希表保證元素的唯一性,鏈表保證元素有序,也就是存入順序和取出順序相同。
**TreeSet:**基於 TreeMap 的 NavigableSet 實現。使用元素的自然順序對元素進行排序,或者根據創建 set 時提供的 Comparator 進行排序,具體取決於使用的構造方法。(底層結構是紅黑樹)
注意,此實現不是同步的。如果多個線程同時訪問一個 TreeSet,而其中至少一個線程修改了該 set,那麼它必須 外部同步。
有兩種排序方式:A-自然排序,也是默認排序(實現Comparable),B-比較器排序。取決於構造方法。

1.2 List集合
List集合主要分爲Arraylist、Linkedlist、Vector。(有序 可重複)
ArrayList集合底層是數組,而且是Object [] 類型;ArrayList集合查詢數據很快,但是增刪數據很慢;線程不安全。
LinkedList集合底層是鏈表,雙向循環列表;非線性安全;LinkedList集合增刪數據很快。但是查詢數據很慢。
Vector實現了一個list接口,表示一個可變的對象數組,主要用於多線程環境下。線程安全。
1.3 Map集合
在存放的鍵值對中不允許有重複的鍵;每個鍵最多隻能映射一個值。
實現方式有四種:HashMap,LinkedHashMap,Hashtable,TreeMap。 
HashMap:基於hash表的Map接ロ的非同步實現,非線程安全,高效, 支持null値和null健,採用數組+鏈表+紅黑樹實現。存儲數據採用哈希表結構,元素存取順序不能保證一致。由於要保證鍵的唯一、不重複,需要重寫鍵的hashCode()方法、equals()方法。(基於散列表實現,採用對象的hashcode可以進行快速查詢)
**HashTable:**線程安全,低效, 不支持null値和null健。
**LinkedHashMap:**是HashMap的一個子類,保存了記錄的插入排序。存儲數據採用的哈希表結構+鏈表結構。通過鏈表結構可以保證元素的存取順序一致;通過哈希表結構可以保證的鍵的唯一、不重複,需要重寫鍵的hashCode()方法、equals()方法。採用列表來維護內部的順序。
**SortMap:**TreeMap,能夠把它保存的記錄根據鍵排序,默認鍵值的升序排序。
2 Java中的HashMap的工作原理是什麼?
Java中的HashMap是以鍵值對(key-value)的形式存儲元素的。HashMap需要一個hash函數,它使用hashCode()和equals()方法來向集合/從集合添加和檢索元素。當調用put()方法的時候,HashMap會計算key的hash值,然後把鍵值對存儲在集合中合適的索引上。如果key已經存在了,value會被更新成新值。HashMap的一些重要的特性是它的容量(capacity),負載因子(load factor)和擴容極限(threshold resizing)。
**HashMap:**當程序試圖將一個key-vlaue對放入HashMap中時,程序首先根據該key的hashCode()返回值決定該Entry的存儲位置;如果兩個Entry的key的hashCode()返回值相同,那它們的存儲位置相同。如果這兩個Entry的key通過equals比較返回true,新添加Entry的value將覆蓋集合中原有Entry的value,但key不會覆蓋。如果這兩個Entry的key通過equals比較返回false,新添加的Entry將與集合中原有Entry形成Entry鏈,而且新添加的Entry位於Entry鏈的頭部。
3 HashMap和HashTable,TreeMap的區別?
HashMap底層是數組加單項鍊表結構的,鍵是無序的不可重複的。允許Null鍵Null值。線程不同步,效率高
HashTable底層也是動態數組的數據結構。鍵是無序不可重複的。不允許Null鍵Null值。線程同步,效率低。
TreeMap底層是紅黑樹。自然排序,不能重複。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章