談談Java的Collection接口

談談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,通常狀況下,能夠隨便往裏面添加。dom

Collection s = new Collection();
s.add(你要添加的);
s.add("你要添加的");

有時須要注意的時候,若是操做的集合是不容許重複值的,往裏面添加就會報錯。返回的是false.code

2.void clear()

移除容器中的全部元素,該集合不支持移除的話就會拋出UnsupportedOperationException異常(不支持該操做)對象

//接着用上面的s集合
s.clear();
//這時候集合爲空了

3.boolean contains(Object o)

用來檢查此集合是否包含指定元素或者對象,包含則返回true不包含就返回false;會返回兩種錯誤。接口

4.boolean isEmpty()

用來檢查集合中是否爲空,若是爲空就返回true。隊列

5.Iterator iterator()

返回一個Iterator 迭代器,這個方法是用來遍歷集合中的元素的,在一些須要獲取集合中的元素(包括打印輸出,調用等場景下),依賴於集合而存在的,有next方法和hasNext方法。

這兩個方法通常狀況下都是綁定一塊兒用的。形式以下。

//其主要的用法以下,遍歷的功能
//經過集合對象獲取迭代器對象
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(輸出):

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

相關文章
相關標籤/搜索