理解java容器:iterator與collection,容器的起源


  • iterator與collection:容器的起源
    • iterator的簡要介紹
    • Collection的簡要介紹
      • 基本特性
      • 方法
        關於容器

        java中有許多有用的容器,比如說Set,廣泛使用的ArrayList,這些容器使用的非常廣泛
        所有這些容器都是直接或間接源於一個接口:Collection
        (不是Collections)

        iterator與collection:容器的起源

        容器是java的一個非常重要的組成部分,幾乎處處都會用到。

        iterator的簡要介紹

        java當中有兩個與容器迭代有關的接口,iterable與iterator,這兩個接口實現了容器中的迭代功能。從《java編程思想》p459中的容器繼承關系圖中可以看出:

        Iterator是所有容器的基礎。
        可以這樣來考慮:java中的容器,包括set,list,map等等,其最基本的屬性就是可迭代,先實現了迭代的接口,然后才根據各自的功能進行補全。

        iterable

        iterable顧名思義,就是表示實現了這個接口的類都是可迭代的,iterable的主要用處就是提供 類型的iterator,以及使任何實現了這個接口的類都能夠使用forEach語句進行迭代
        iterable的官方文檔如下:
        https://docs.oracle.com/javase/9/docs/api/java/lang/Iterable.html

        iterator

        iterator就是容器的迭代器,容器對我們封裝了內部實現,作為補償,每種容器都可以通過其內部的迭代器進行迭代。
        iterator的官方文檔如下:
        https://docs.oracle.com/javase/9/docs/api/java/util/Iterator.html

        iterator接口中提供了四個方法,分別是:

        default void forEachRemaining(consumer<? super E> action);
        

        (我也不知道這個方法的具體含義)

        以及

        Boolean hasNext();
        E next();
        default void remove();
        

        這三個方法就是我們常用來對容器進行迭代的了。
        其中hasNext() 就是判斷是否還有剩余元素沒有被迭代訪問,而next()方法就是返回當前的迭代器所指向的位置的接下來一個元素的引用。
        第三個方法remove()需要注意
        這個方法是將next()所指向的元素移除,對每一個next()指向,只能調用一次這個方法

        關於remove方法

        如果一個正在迭代中的collection通過除remove方法之外的途徑被修改了,那么一個iterator的行為是未定義的,可能會產生許多匪夷所思的結果。除非子類覆蓋了這個方法並給出了確定的行為。
        同樣的,如果在使用了forEachRemaining方法之后調用remove方法,其結果也是未定義的

        Collection的簡要介紹

        源代碼中對collection的定義是這樣的:

        public interface Collection<E> extends Iterable<E>
        

        iterator是容器的最基本最抽象的性質——可迭代
        而collection則對其稍微具體地完善了一下:collection代表了一組可迭代的對象
        在collection接口沒有給出其它具體的要求,所以一個collection可以有各種不同的實現方式,比如說set與list就是兩種不同的實現,能夠分別滿足不同的功能要求。
        collection的官方文檔如下:
        https://docs.oracle.com/javase/9/docs/api/java/util/Collection.html

        基本特性

        • 所有對collection的實現都必須至少包含兩種構造方法:一種不包含參數,直接創建一個空的對象。而另一種則含有一個collection類型的參數,該構造方法創建一個對象,並將參數的collection內的對象全都拷貝進來。對於這一點,沒有任何強制性的限定,如果要親自寫一個新的collection的話,要不要實現這兩種構造器全看程序員的心情
        • collection中包含可選操作,具體描述可以參考《java編程思想》-17.4-可選操作,簡要來說,就是在對collection的implements中,可以不用實現所有的方法,比如說remove,是可以不要的,如果不嫌麻煩的話
        • collection的implement有時候會對其內部的元素進行限定,比如說不能為null,或者不能含有重復元素

        方法

        雖然java沒有對collection接口的具體形式作出任何限制,但是通過接口里面的一大堆方法,可以知道一個collection所至少需要具備的功能:
        (只列舉了一部分)

        • int size() 返回collection中的元素個數
        • boolean isEmpty() 是否為空
        • boolean contains(Object o) 是否包含o對象
        • boolean containsAll(Collection<?> c) 是否包含c collection中的所有對象
        • Iterator iterator() 返回為該collection量身定制的迭代器
        • Object[] toArray() 將collection轉化為一個對象的數組
        • boolean add(E e) 添加一個e元素
        • boolean addAll(Collection<? Extends E> c) 添加一堆元素
        • boolean remove(Object o) 刪除一個o對象
        • boolean removeAll(Collection<?> c) 刪除一堆元素
        • void clear() 清空,讓我們從頭開始
        • boolean equals(Object o) 關於等價的判斷
        • int hashCode() 返回哈希值

  • 免責聲明!

    本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



     
    粵ICP備18138465號   © 2018-2025 CODEPRJ.COM