談談Collection
前言
這一篇講的collection接口;首先,集合是用來存儲數據的,它是基於某種數據結構數據容器。常見的數據結構:數組(Array)、集(Set)、隊列(Queue)、鏈表(Linkedlist)、樹(Tree)、堆(Heap)、棧(Stack)和映射(Map)等結構。集合大類分為了Collection和Map。如下圖

Collection
這一篇文章的內容——現在講下collection,“集合、容器”,用來存儲數據的,它是一個接口,不能直接實例化使用;只能通過它的子類來完成,從上圖來看,Collection分為List和Set,List集合中的元素是有序的、可重復的,而Set集合中的元素是無序的、不能重復的。List集合強調的是有序,Set集合強調的是不重復。下面是它的已知實現類。

Collection是描述所有序列容器的共性的根接口,可能會被認為是一個附屬接口,即因為要表示其他若干個接口的共性而出現的接口。同時為什么要將其作為接口?是因為可以使我們能夠創建更通用的代碼。通過針對接口而非具體實現來編寫代碼,這樣,才可以更好地應用於更多的對象類型。
下面的是Collection更加仔細一點的分類。今天這篇重點介紹一下Collection的幾個方法,掌握了這些,對於它的子類都是可以直接拿來用的。子類的介紹后面再總結出來。
方法
遇到一些自己不熟的知識點,在IDEA上可以直接查看該接口的詳細源碼(ctrl加鼠標左鍵),點開旁邊的結構圖按鈕,可以直觀得去查看這些方法

1.boolean add(E)
這個一看就知道了,就是添加功能,往集合里面添加元素或者對象的方法,若是list這種,因為它返回都是true,一般情況下,可以隨便往里面添加。
Collection s = new Collection();
s.add(你要添加的);
s.add("你要添加的");
有時需要注意的時候,如果操作的集合是不允許重復值的,往里面添加就會報錯。返回的是false.
2.void clear()
移除容器中的所有元素,該集合不支持移除的話就會拋出UnsupportedOperationException異常(不支持該操作)
//接着用上面的s集合
s.clear();
//這時候集合為空了
3.boolean contains(Object o)
用來檢查此集合是否包含指定元素或者對象,包含則返回true不包含就返回false;會返回兩種錯誤。

4.boolean isEmpty()
用來檢查集合中是否為空,如果為空就返回true。
5.Iterator
iterator()
返回一個Iterator

這兩個方法一般情況下都是綁定一起用的。形式如下。
//其主要的用法如下,遍歷的功能
//通過集合對象獲取迭代器對象
Iterator i = 集合.iterator();
//hasNext方法是布爾型的返回值,有元素在集合里面的時候就會返回true
while(it.hasNext()){
System.out.println(it.next());
}
6.int size()
用來返回的集合的長度,也就是集合里面的元素的個數。
//直接使用,返回長度
集合.size();
7.Boolean remove()
用來刪除集合中的元素,對象,只要有移除動作就會返回true。
總結
什么是可選操作
在看源碼的時候,會發現有些方法在后面會標記為可選操作 (optional operation)。
執行各種不同的添加和移除的方法在Colletion接口中都是可選操作,這意味着實現類並不需要為這些方法提供功能定義。......如果一個操作是可選的,編譯器仍舊會嚴格要求你只能調用該接口中的方法。
它聲明調用某些方法將不會執行有意義的行為,相反,它們會拋出異常。 ——《Java編程思想》
異常UnsupportedOperationException(這個和上面講remove時候不支持操作的時候拋出一樣的異常)
大概意思是collection子類可以重寫這個方法以達到子類自己的目的,也可以不覆蓋這個方法但是。沒有實現這個方法的子類使用這個方法的話會拋出UnsupportedOperationException異常。(這個未獲得支持的異常在運行時候才能探測到,屬於動態類型異常),先看下報錯的代碼示例
package music.daima.ebook;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
/**
* @author yhy
* 這個是用來觀察java中的可選操作方法的一些特點以及定義使用以及報錯的原因,這是書上的代碼
*/
public class Unsupport {
static void test(String msg, List<String> list) {
System.out.println("--- " + msg + " ---");
Collection<String> c = list;
Collection<String> subList = list.subList(1,8);
Collection<String> c2 = new ArrayList<String>(subList);
try {
c.retainAll(c2);
}
catch(Exception e) {
System.out.println("retainAll(): " + e);
}
try { c.removeAll(c2); } catch(Exception e) {
System.out.println("removeAll(): " + e);
}
try { c.clear(); } catch(Exception e) {
System.out.println("clear(): " + e);
}
try { c.add("X"); } catch(Exception e) {
System.out.println("add(): " + e);
}
try { c.addAll(c2); } catch(Exception e) {
System.out.println("addAll(): " + e);
}
try { c.remove("C"); } catch(Exception e) {
System.out.println("remove(): " + e);
}
// The List.set() 雖然改變了值但沒有改變它的數據結構尺寸
try {
list.set(0, "X");
} catch(Exception e) {
System.out.println("List.set(): " + e);
}
}
public static void main(String[] args) {
//asList方法:返回由指定數組支持的固定大小的列表。 (將返回的列表更改為“寫入數組”。)該方法作為基於數組和基於集合的API之間的橋梁,與Collection.toArray()相結合 。
//返回的列表是可序列化的,並實現RandomAccess 。 此方法還提供了一種方便的方式來創建一個初始化為包含幾個元素的固定大小的列表:
List<String> list = Arrays.asList("A B C D E F G H I J K L".split(" "));
System.out.println(list.getClass());
test("Arrays.asList()", list);
// System.out.println(list1.getClass());
test("Modifiable Copy", new ArrayList<String>(list));
//test("unmodifiableList()",Collections.unmodifiableList(new ArrayList<String>(list)));
}
}
output(輸出):

集合使用的整體框架(步驟)
