- Java Collection
集合是什麼:集合就是“由若干個確定的元素所構成的整體”。
爲什麼要在計算機中引入集合:在Java中,如果一個Java對象可以在內部持有若干其他Java對象,並對外提供訪問接口,我們把這種Java對象稱爲集合。很顯然,Java的數組可以看作是一種集合。
既然Java提供了數組這種數據類型,可以充當集合,那麼,我們爲什麼還需要其他集合類?這是因爲數組有如下限制:
- 數組初始化後大小不可變;
- 數組只能按索引順序存取。
因此,我們需要各種不同類型的集合類來處理不同的數據,例如:
- 可變大小的順序鏈表;
- 保證無重複元素的集合;
- 保存有映射關係的數據;
- ...
- 集合的體系結構
集合類,主要由兩個接口派生而來:==Collection 和 Map==
其中,Collection是單列集合的頂層接口(父接口),用於存儲引用類型數據,所謂單列集合,就是指每一個元素都是一個單獨的個體。
我們需要重點掌握:==HashSet、LinkedHashSet、TreeSet== ==ArrayList、LinkedList、Vector==
而Map,則是雙列集合的頂層接口(父接口),所謂雙列集合,就是指每個操作都是以一對數據作爲單位來進行的。Map 實現類,用於保存具有映射關係的數據,也就是 ==key-value== 對,但 ==key 不會重複==,一般 需要通過 key 來找到對應的 value 值。
我們需要重點掌握:==HashMap、TreeMap、LinkedHashMap==
Java集合的設計有幾個特點:一是實現了接口和實現類相分離,例如,有序表的接口是List
,具體的實現類有ArrayList
,LinkedList
等,二是支持泛型,我們可以限制在一個集合中只能放入同一種數據類型的元素,例如:
List<String> list = new ArrayList<>(); // 只能放入String類型
最後,Java訪問集合總是通過統一的方式——迭代器(Iterator)來實現,它最明顯的好處在於無需知道集合內部元素是按什麼方式存儲的。
由於Java的集合設計非常久遠,中間經歷過大規模改進,我們要注意到有一小部分集合類是遺留類,不應該繼續使用:
Hashtable
:一種線程安全的Map
實現;Vector
:一種線程安全的List
實現;Stack
:基於Vector
實現的LIFO
的棧。
還有一小部分接口是遺留接口,也不應該繼續使用:
Enumeration<E>
:已被Iterator<E>
取代。
- 使用Collection
因爲Collection是接口所以注意他不能創建對象,需要使用多態去實現對於Collection方法的使用。Collection存儲元素的特點1. 數據可重複;2.數據存儲無序(看集合是否是無序/有序,與添加和輸出順序無關,看是否通過下標能得到元素內容)
Collection常用方法:
- add(Object obj) -向集合中添加元素
- remove(Object obj) -將obj從集合中移除
- clear() -將集合中存儲的所有的元素都清空
- isEmpty() -判斷集合是否爲空
- size() -返回集合中元素個數 其實集合的長度
- contains(Object obj) -判斷集合中是否包含obj此元素
下面進入代碼演示:
public class CollectionDemo1 {
public static void main(String[] args) {
//collection是接口 不能直接創建對象 因此我們採取多態 new子類對象向上轉型
//所有的集合導包 ===》java.util包下
//第一步 創建好對象
Collection c1=new ArrayList();
//第二步 往集合中去添加元素
c1.add("張三");
c1.add(11);
c1.add(11);//雖然集合只能存儲引用類型數據 但是因爲基本類型有其包裝類 存儲的時候轉成包裝類類型 (引用類型) 且這裏看到 可以存儲重複的元素
c1.add(true);
c1.add(33.3);
// 移除單個元素
c1.remove(11);
//清空所有元素
//c1.clear();
//判斷集合是否爲空 空元素返回true 有元素返回false
System.out.println("判斷集合是否爲空"+c1.isEmpty());
//得到集合長度
System.out.println("集合的長度(元素個數)"+c1.size());
//判斷此元素是否在集合中
System.out.println("判斷11是否在c1集合中 如果在集合中返回true 如果不在返回的false"+c1.contains(11));
//測試 打印集合名 爲什麼能直接打印集合對象名輸出集合元素內容 因爲了重寫toString
System.out.println(c1);
}
}
Collection帶all的方法:
- addAll(collection c) -將參數c中所有元素,都添加到調用者集合中
- removeAll(collection c) -從調用者集合刪除那些也存在於參數c中的元素
- contains(collection c) -判斷調用者是否包含參數c中的所有元素
- retainAll
(Collection c)
-參數c 中有哪些元素,就在調用者集合中,保留哪些元素(交集)
下面進入代碼演示:
public class CollectionDemo2 {
/*帶all方法與不帶all方法
不帶all方法 對應的基本單個元素
帶all 對應一個集合(Collection)*/
public static void main(String[] args) {
//創建集合對象c1
Collection c1=new ArrayList<>();
//創建集合對象c2
Collection c2=new ArrayList<>();
//向c1添加元素
c1.add(12);
c1.add(1);
c1.add(2);
c1.add(16);
c1.add(126);
//向c2添加元素
c2.add("張三");
c2.add("李四");
//把c1集合元素 添加到c2集合中
c2.addAll(c1);
c2.addAll(c1);
System.out.println(c1);
System.out.println(c2);
//移除c2集合中 c1元素的相關元素內容(c1元素有的 c2有的移除)
c2.removeAll(c1);
System.out.println(c2);
//清空集合中所有元素
//c2.clear();
//判斷c1元素內容 是否在c2集合中 如果是返回true 不是返回false
System.out.println(c2.containsAll(c1));
//保留c1元素內容 在c2集合中
c2.retainAll(c1);
System.out.println(c2);
}
}
Collection的三種遍歷方式
請看代碼演示:
public class CollectionDemo3 {
public static void main(String[] args) {
Collection c1=new ArrayList();
c1.add(22);
c1.add(22);
c1.add(22);
c1.add(22);
c1.add(22);
method01(c1);
method02(c2);
method03(c1);
}
//第一種方式:利用toArray()方法將集合轉成數組 通過數組間接遍歷集合
public static void method01(Collection c1) {
Object[] o1=c1.toArray();
for (Object object : o1) {
System.out.println(object);
}
}
//第二種:使用foreach遍歷集合(只要集合中存在iterator() 迭代器方法 就可以使用foreach遍歷)
public static void method02(Collection c1) {
//for增強的寫法:for(類型 名字:集合對象名/數組名){輸出名字}
for (Object oo : c1) {
System.out.println(oo);
}
}
//第三種:使用迭代器遍歷集合(迭代器的作用遍歷集合元素:迭代器要遍歷的時候會判斷是否有元素 然後再進行遍歷)
public static void method03(Collection c1) {
//第一步 得到迭代器
Iterator i1=c1.iterator();
//hasNext(); 判斷是否有元素的方法
//next(); 通過此方法返回元素內容
//每個元素都需要先判斷 再去輸出內容
while(i1.hasNext()) {//先判斷有沒有元素,有元素返回true 沒有元素返回的false
//再輸出
System.out.println(i1.next());
}
//這個過程類似一個遊標在一行集合元素上滑動,hasNext()用來判斷遊標右邊是否有元素,如果有,返回true,則next()會返回遊標後面的這個元素,並把遊標移動到下個元素之前的位置,這樣依次執行,遍歷完集合,遊標的返回值是false,就跳出循環,遍歷結束。
//現在你知道了,爲什麼直接System.out.println(i1.next());是不行的,只會輸出一個元素
}