java面試必須掌握的技術點--基礎篇--(三)

集合

List、Set、Map的區別
Collection

結構圖

 collection裏面有什麼子類?
list和set是實現了collection接口的

List:

1.可以允許重複的對象。
2.可以插入多個null元素。
3.是一個有序容器,保持了每個元素的插入順序,輸出的順序就是插入的順序。
4.常用的實現類有 ArrayList、LinkedList 和 Vector。ArrayList 最爲流行,它提供了使用索引的隨意訪問,而 LinkedList 則對於經常需要從 List 中添加或刪除元素的場合更爲合適。

Set:

1 不允許重複對象

無序容器,你無法保證每個元素的存儲順序,TreeSet通過 Comparator 或者 Comparable 維護了一個排序順序。

只允許一個 null 元素

4.Set 接口最流行的幾個實現類是 HashSet、LinkedHashSet 以及 TreeSet。最流行的是基於 HashMap 實現的 HashSet;TreeSet 還實現了 SortedSet 接口,因此 TreeSet 是一個根據其 compare() 和 compareTo() 的定義進行排序的有序容器。

Map


Map

Map不是collection的子接口或者實現類。Map是一個接口。
Map 的 每個 Entry 都持有兩個對象,也就是一個鍵一個值,Map 可能會持有相同的值對象但鍵對象必須是唯一的。
TreeMap 也通過 Comparator 或者 Comparable 維護了一個排序順序。
Map 裏你可以擁有隨意個 null 值但最多隻能有一個 null 鍵。
Map 接口最流行的幾個實現類是 HashMap、LinkedHashMap、Hashtable 和 TreeMap。(HashMap、TreeMap最常用)
 什麼場景下使用list,set,map呢?
list:有序訪問、索引訪問
set(HashSet、LinkedHashSet 或者 TreeSet):去重
map:鍵值存儲

如果你經常會使用索引來對容器中的元素進行訪問,那麼 List 是你的正確的選擇。如果你已經知道索引了的話,那麼 List 的實現類比如 ArrayList 可以提供更快速的訪問,如果經常添加刪除元素的,那麼肯定要選擇LinkedList。
如果你想容器中的元素能夠按照它們插入的次序進行有序存儲,那麼還是 List,因爲 List 是一個有序容器,它按照插入順序進行存儲。
如果你想保證插入元素的唯一性,也就是你不想有重複值的出現,那麼可以選擇一個 Set 的實現類,比如 HashSet、LinkedHashSet 或者 TreeSet。所有 Set 的實現類都遵循了統一約束比如唯一性,而且還提供了額外的特性比如 TreeSet 還是一個 SortedSet,所有存儲於 TreeSet 中的元素可以使用 Java 裏的 Comparator 或者 Comparable 進行排序。LinkedHashSet 也按照元素的插入順序對它們進行存儲。
如果你以鍵和值的形式進行數據存儲那麼 Map 是你正確的選擇。你可以根據你的後續需要從 Hashtable、HashMap、TreeMap 中進行選擇。
Arraylist 與 LinkedList 區別
ArrayList和LinkedList都是實現了List接口的類,他們都是元素的容器,用於存放對象的引用;

他們都可以對存放的元素進行增刪改查的操作,還可以進行排序。

但是,他們還是有區別的。

除了實現對List接口的實現,他們還實現了其他的接口,由此造就了他們之間的差異;

ArrayList

ArrayList:內部使用數組的形式實現了存儲,實現了RandomAccess接口,利用數組的下面進行元素的訪問,因此對元素的隨機訪問速度非常快。

因爲是數組,所以ArrayList在初始化的時候,有初始大小10,插入新元素的時候,會判斷是否需要擴容,擴容的步長是0.5倍原容量,擴容方式是利用數組的複製,因此有一定的開銷;

另外,ArrayList在進行元素插入的時候,需要移動插入位置之後的所有元素,位置越靠前,需要位移的元素越多,開銷越大,相反,插入位置越靠後的話,開銷就越小了,如果在最後面進行插入,那就不需要進行位移;

LinkedList

LinkedList:內部使用雙向鏈表的結構實現存儲,LinkedList有一個內部類作爲存放元素的單元,裏面有三個屬性,用來存放元素本身以及前後2個單元的引用,另外LinkedList內部還有一個header屬性,用來標識起始位置,LinkedList的第一個單元和最後一個單元都會指向header,因此形成了一個雙向的鏈表結構。

LinkedList是採用雙向鏈表實現的。所以它也具有鏈表的特點,每一個元素(結點)的地址不連續,通過引用找到當前結點的上一個結點和下一個結點,即插入和刪除效率較高,只需要常數時間,而get和set則較爲低效。
LinkedList的方法和使用和ArrayList大致相同,由於LinkedList是鏈表實現的,所以額外提供了在頭部和尾部添加/刪除元素的方法,也沒有ArrayList擴容的問題了。另外,ArrayList和LinkedList都可以實現棧、隊列等數據結構,但LinkedList本身實現了隊列的接口,所以更推薦用LinkedList來實現隊列和棧。

綜上所述,在需要頻繁讀取集合中的元素時,使用ArrayList效率較高,而在插入和刪除操作較多時,使用LinkedList效率較高。
————————————————
 

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