- 1. Collection 接口簡介
- 2. Collection的子接口
-
- 2.1 List接口
- List接口的實作類
-
- ① ArrayList
- ② Vector
- ③ Stack
- ④ LinkedList
- 2.2 Set接口
-
- Set接口的常用實作類
- ① HashSet
- ② LinkedHashSet
- ③ TreeSet
- 2.3 Queue接口
1. Collection 接口簡介
Collection 接口繼承自Iterable接口
是以可以通過疊代器疊代元素
Collection接口常用方法
方法名 | 解釋 |
---|---|
boolean add(E e) | 向集合中添加元素 |
int size | 擷取集合中元素的個數 |
void clear() | 清空集合 |
boolean contains(Object o) | 判斷集合中是否有元素o |
boolean remove(Object o) | 删除集合中的一個元素 |
boolean isEmpty() | 判斷集合是否為空 |
Object[] toArray | 将集合轉為數組 |
2. Collection的子接口
① List:存放有序、可重複的元素
② Set:存放無序、不可重複的元素
③ Queue:隊列接口
2.1 List接口
List接口繼承自Collection接口
List常用方法:
方法 | 解釋 |
---|---|
T get(int index) | 通過下标傳回集合中對應位置的元素 |
T set(int index,T element) | 在集合中的指定位置存入對象 |
add(Object element) | 向集合的尾部添加指定的元素 |
List接口的實作類
① ArrayList
ArrayList 是開發中使用頻率最高的 List 實作類,實作了長度可變的數組,在記憶體中配置設定連續空間,是以讀取快,增删慢。
特點: 有序、可重複
底層資料結構: Object[]數組(是以可以存儲不同類型的資料)
Array和ArrayList的差別
1. Array長度在定義之後就不運作改變了,而ArrayList是長度可變的,可以自動擴容。
2. Array隻能存儲相同類型的資料,ArrayList可以存儲不同類型的資料,ArrayList在存入基本資料類型的時候,會自動轉換為對于的包裝類
② Vector
Vector是線程安全的ArrayList,但效率較低,實作線程安全直接通過 synchronized 修飾方法來完成
③ Stack
Stack是Vector 的子類,實作了棧的資料結構,(後進後出)
常用方法:
push:入棧
peek:取出棧頂元素,将棧頂複制一份取出,取完之後棧内的資料不變。
pop:取出棧頂元素,直接取出棧頂元素,取完之後棧内的資料減一
④ LinkedList
從源碼可以看出,LinkedList繼承了List,還繼承了Deque接口等
Deque接口是Queue(隊列)的子接口
LinkedList的底層實作是連結清單
ArrayList 和 LikedList 的差別:記憶體中存儲的形式不同,ArrayList 采用的數組的方式,LinkedList實作采用的是雙向連結清單的形式
連結清單在記憶體中存儲空間不連續,是以讀取慢,連結清單通過節點的後置指針來尋找下一個節點,是以增删快(數組進行增删需要将後續的所有元素往後或往前移動)
LinkedList的特點:
(1)允許null值
(2)内部以雙向連結清單的形式來儲存集合中的元素
(3)線程不安全,線程安全的可以使用synchronizedList
(4)因為底層是連結清單,是以所有指定位置的操作都是從頭開始周遊進行的
(5)元素是有序的,輸出順序與輸入順序一緻
LinkedList 和 Stack 的 pop()方法的差別和相同點
相同點:pop 方法都是取出集合中的第一個元素,但是兩者的順序是相反的
不同點:Stack 是“後進先出”,是以 pop 取出的是最後一個元素
LinkedList 是“先進先出”,是以 pop 取出的是第一個元素
2.2 Set接口
Set 集合是以散列的形式存儲資料,是以元素是沒有順序的,可以存儲一組無序且唯一的資料
特點:無序,不可重複
Set接口的常用實作類
① HashSet
HashSet底層是HashMap,利用了key來保證元素的唯一性
特點:無序(元素的存儲順序和周遊順序不一緻)
例如
HashSet set = new HashSet();
set.add("一");
set.add("二");
set.add("三");
set.add("四");
set.add("五");
Iterator iterator = set.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next()); //輸出順序為"一 五 三 四 二"
}
HashSet是如何去重的?
① 對于基本類型,直接按值進行比較
② 對于引用資料類型,會先比較hashCode()傳回值是否相同,如果不同則代表不是同一個對象,如果相同則繼續比較equals()方法傳回值是否相同,都相同說明是同一個對象。
③ 自定義類使用HashSet存儲除了重寫equals()方法還要重寫hashCode()方法,因為内容相同的對象hashCode()值不一定相同,因為隻有hashCode()和equals()都相同才說明是同一個對象。
② LinkedHashSet
LinkedHasSet 是 Set 的另外一個實作類,可以存儲一組有序且不重複的元素
有序:元素的存儲順序和周遊順序一緻
例如:
LinkedHashSet linkedHashSet = new LinkedHashSet();
linkedHashSet.add("一");
linkedHashSet.add("二");
linkedHashSet.add("三");
linkedHashSet.add("四");
linkedHashSet.add("五");
Iterator iterator = linkedHashSet.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next()); //輸出為"一 二 三 四 五"
}
③ TreeSet
TreeSet 也是存儲一組有序且唯一的資料
LinkedHashSet 和 TreeSet 都是存儲一組有序且唯一的資料,但是這裡的兩個有序有差別
LinkedHashSet 的有序是指元素的存儲順序和周遊順序是一緻的
TreeSet 的有序是指集合内部會自動對所有的元素按照升序進行排列,無論存入的順序是什麼,周遊的時候一定按照升序輸出(沒有繼承Comparable接口的類不能存入TreeSet)
補充:Compareble接口中有CompareTo()方法,當一個類繼承該接口并實作CompareTo()方法,則可以進行比較,也就可以存入TreeSet
2.3 Queue接口
Queue 就是隊列,底層實作了隊列的資料結構(先進先出)
Queue 的實作類是 AbstractQueue,它是一個抽象類,不能直接執行個體化
其實作子類 PriorityQueue繼承了抽象類AbstractQueue
Queue 中添加的資料必須是可以比較排序的,這一點和TreeSet類似
Queue 預設給元素進行升序排列,即自然排序
關于阻塞隊列可以看我這篇部落格 多線程下的阻塞隊列
補充:LinkedList 實作了 Deque 接口,而 Deque 接口是 Queue 的子接口