天天看點

Collection集合接口及其子接口、實作類1. Collection 接口簡介2. Collection的子接口

  • 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集合接口及其子接口、實作類1. Collection 接口簡介2. 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

Collection集合接口及其子接口、實作類1. Collection 接口簡介2. Collection的子接口

從源碼可以看出,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 的子接口

繼續閱讀