1. 程式人生 > >Set介面原始碼分析-java8

Set介面原始碼分析-java8

1.toArray()和toArray(T[] a)

將set例項轉為String[]的方式如下:

Set<String> x=new HashSet<String>;
String[] y = x.toArray(new String[0]); 

注意:toArray(new Object[0])和toArray()兩者在功能上完全相同.

2.set介面的hash值定義

Hash值=sum(set中每一個元素的hash值)
注意:如果元素為null,則hash值定義為0.

3.java8新增方法

只有一個:分割器spliterator()

4.程式碼分析

    package sourcecode.analysis;

    /**
     * @Author: cxh
     * @CreateTime: 18/3/21 11:14
     * @ProjectName: JavaBaseTest
     */

    import java.util.*;

    /**
     * set集合不包含重複元素.並且至多有一個null元素.
     * 正如其名稱所暗示的那樣,這個介面模擬了數學的集合抽象.
     *
     * 除了繼承了Collection介面,遵從構造器,add,equals,hashcode4個方法的規定外,Set介面還提供了
     * 一些額外的規定.
     * 為方便起見,繼承的方法在set集合中也進行了宣告.(這些宣告附帶的規範已根據Set介面定製,但它們
     * 不包含任何其他規定。)
     *
     * 毫不奇怪,在構造器上的額外規定中,所有建構函式都必須建立一個不包含重複元素的集合(如上所定義)
     *
     * 注意:如果可變物件被用做set集合的元素,一定要引起足夠重視.
     * 如果set集合中的物件值的改變影響了equals方法的比較結果,會對set產生什麼影響並未定義.
     * 特別注意:set元素將自己作為儲存元素是被禁止的.
     *
     * 一些set實現類在對它們能儲存的元素上有限制.
     * 比如,一些實現類禁止儲存null;
     * 一些則對儲存元素的型別有限制.
     * 嘗試新增非法元素會丟擲"空指標異常","型別轉化異常".
     * 嘗試查詢一個非法元素,會丟擲異常or只是返回false.
     * 一些實現類將展現前一種行為,一些將展現後者.
     * 更一般的的情況是,插入非法字元會導致插入失敗且丟擲異常;當然插入也可能成功,這取決於類的實現.
     * 這些異常可以根據不同的實現類有不同的實現方式.
     *
     * set集合是java集合框架的一員.
     *
     * @author  Josh Bloch
     * @author  Neal Gafter
     * @see Collection
     * @see java.util.List
     * @see SortedSet
     * @see HashSet
     * @see TreeSet
     * @see AbstractSet
     * @see Collections#singleton(java.lang.Object)
     * @see Collections#EMPTY_SET
     * @since 1.2
     */

    public interface Set<E> extends Collection<E> {

        /*-----查詢操作----*/

        int size();

        boolean isEmpty();

        boolean contains(Object o);


        Iterator<E> iterator();

        /**
         * 返回陣列是"安全"的,只要沒有原set中的引用指向陣列元素.(換句話說,即使set類本身由陣列
         * 儲存元素,但是這一方法必須分配新的陣列空間)
         * 因此方法呼叫著可以隨意更改返回陣列.
         */
        Object[] toArray();

        /**
         * 返回set中所有的元素;返回陣列型別為引數型別.
         * 如果set和引數陣列型別一致,則直接返回set的底層陣列;
         * 否則,會新建立一個和set的size大小的陣列
         *
         * 如果這個set適合指定的陣列,並且有空餘的空間(即陣列的元素多於這個集合)
         * 緊隨該set結尾的陣列被設定為null。(這對確定這個長度很有用,只有在呼叫者知道
         * 該set不包含null時才設定。)
         *
         * 將set<String>例項轉為String[]的方式如下:
         *
         * String[] y = x.toArray(new String[0]);
         *
         * 注意:toArray(new Object[0])和toArray()兩者在功能上完全相同.
         *
         */
        <T> T[] toArray(T[] a);


        /*------修改操作-----*/

        //如果set中已有要add的元素,則返回false.
        boolean add(E e);


        //如果set包含刪除元素,返回true
        boolean remove(Object o);


        /*---------塊操作--------*/

        /**
         * 如果set包含指定元素,則返回true;
         * 如果引數e也是一個set且引數e是set的一個subset,則返回true;
         */
        boolean containsAll(Collection<?> c);

        //如果指定的集合也是一個集合,則此操作將有效地修改此集合,使其值為兩個集合中的交集
        boolean addAll(Collection<? extends E> c);

        /**
         * 刪除set中有,但在引數集合c中沒有的元素.
         * 如果指定的集合也是一個集合,則此操作將有效地修改此集合,使其值為兩個集合中的交集
         */
        boolean retainAll(Collection<?> c);

        /**
         * 刪除set中有,在引數集合c中也有的元素.
         * 如果指定的集合也是一個集合,則此操作將有效地修改此集合,使其值為兩個集合中的交集
         */
        boolean removeAll(Collection<?> c);

        void clear();


        /*-------比較和hash操作-------*/

        /**
         * 結果為ture的條件
         * 1.兩個都是set
         * 2.同樣的size
         * 3.元素等價
         */
        boolean equals(Object o);

        /**
         * hash值定義:sum(set中每一個元素的hash值)
         * 如果元素為null,則hash值定義為0
         */
        int hashCode();

        /**
         * Creates a {@code Spliterator} over the elements in this set.
         * 建立set的一個分割器.
         *
         * set介面定義中:分割器屬性值有:DISTINCT
         * set介面的其它實現類如果有額外的分割器屬性值,一定要給出文件說明.
         *
         * 建立的分割器屬性值額外添加了:SIZED,SUBSIZED.
         *
         * @since 1.8
         */
        @Override
        default Spliterator<E> spliterator() {
            return Spliterators.spliterator(this, Spliterator.DISTINCT);
        }
    }