java中的List、Set、Queue、Map接口

Java集合類對象是用來封裝數據的基本。
常見的集合接口有List、Set、Queue、Map。這裏也只是介紹這幾種接口中的常用實現類。
各接口與實現類之間的關係如下圖(虛線框代表接口,實線框代表接口的實現類)。
在這裏插入圖片描述
在這裏插入圖片描述
List接口的常用實現類:ArrayList、LinkedList、Vector。

  • ArrayList 底層使用的數據結構是數組,一般數組初始化長度爲10,當容量不夠時,使用Arrays.copyOf() 方法對數組進行擴容、元素複製,擴容後的容量是之前容量的1.5倍。

  • LinkedList 底層使用的數據結構是鏈表,因此增刪的效率高於ArrayList,但是查詢效率低於ArrayList。

  • Vector 與ArrayList類似,但是Vector是線程安全的,因爲Vector中方法都是被 synchronize 修飾,多線程情況下是同步執行的。
    Stack 類繼承了 Vector 類,實現了棧的數據結構,同時也是線程安全

PS 線程安全:指的是多線程對數據進行操作時,不會出現數據錯誤。線程不安全的例子,線程 A 向 list 中第一個位置添加元素 one,還沒有來得及對 size 進行 + 1 而CPU時間到了,線程 B 向 list 中添加一個元素 two ,由於 size 等於0,two只能添加在 list 的第一個位置,所以two 元素會覆蓋掉one,之後線程 A 、B 都對size 做 +1 操作,size就成 2 了,這與 list 中只有一個元素不符,出現了數據錯誤。

Set接口的常用實現類:HashSet、TreeSet。 元素是唯一的,不能有重複元素但是允許null值,通過 key 的 hashCode(equals() 方法)來判斷元素是否重複。

  • HashSet 通過HashMap實現的,底層數據結構是數組(散列表),對 HashMap 中key-value 的 key 進行散列。
  • TreeSet 通過TreeMap實現的,底層數據結構是紅黑樹,對 TreeMap 中key-value 的 key 進行散列,存入的元素是有序的。

Queue的子接口爲Deque接口的常用實現類:ArrayDeque、LinkedList。

  • ArrayDeque 底層是有首位指針的數組,是一個雙端隊列(可以對兩端進行添加與刪除操作),因此可以實現棧的數據結構(對一端進行增刪,即可達到先進後出的效果),常用方法:deque.addLast(Object object) 與 deque.pollLast();

  • LinkedList。 底層實現是鏈表,當它實現 Deque 接口時(它也可以實現 List 接口)就是一個隊列,先進先出、後進後出,常用方法:linkedList.add(Object object) 與 linkedList.poll()。

Map接口的常用實現類:HashMap、TreeMap 實現 key-value 的映射。

  • HashMap 底層數據結構是數組(哈希表)。
  • TreeMap 底層數據結構是紅黑樹,有序的。
    也可以通過自定義排序方式進行排序。實現方法:使數據模型類實現Comparable 接口中只提供了一個方法: int compareTo(Object obj) ,該方法的返回值是 int 。如果返回值爲正數,則表示當前對象(調用該方法的對象)比 obj 對象“大”;反之“小”;如果爲零的話,則表示兩對象相等。下面是一個實現了 Comparable 接口的 Student 類:

常用方法總結
多數集合接口的實現類都用remove()進行刪除元素,但是Stack使用pop(), Deque使用pollLast()/pollFirst。
實現Collection接口的下List,Set,Queue接口的實現類使用add(Object obj)添加元素,但是Deque使用addFirst()/addLast(),Stack使用push()。
實現Map接口的現實類使用put(Object k, Object v)添加元素,使用map.get(Object key)取出元素。

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