Set介面原始碼分析-java8
阿新 • • 發佈:2019-02-16
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); } }