摘要:集合類關系是和的父接口。相等必須是對稱的,約定只能和其它相等,亦然。和接口在中引入,這個單詞是和的合成,用來分割集合以給并行處理提供方便。這些并不立即執行,而是等到最后一個函數,統一執行。
集合類關系:
Collection ├List │├LinkedList │├ArrayList │└Vector │ └Stack └Set Map ├Hashtable ├HashMap └WeakHashMapCollection
java.util.Collection
Collection是List和Set的父接口。它繼承了Iterable接口,所以每個Collection的子類應該是可以迭代訪問其中的元素的。
我注意到一個有意思的函數,該函數在Java1.8中引入。該函數的功能是從集合中刪除所有滿足條件的元素,代碼實現平平無奇,主要是函數有一個default修飾。Java8提供了default讓接口中也可以實現方法體,目的是為了讓開發者在給interface添加新方法時,不必再一一修改實現該接口的類,這些類可以使用默認的方法實現。
default boolean removeIf(Predicate super E> filter) { Objects.requireNonNull(filter); boolean removed = false; final IteratorCollection的equalseach = iterator(); while (each.hasNext()) { if (filter.test(each.next())) { each.remove(); removed = true; } } return removed; }
Collection的equals方法的重寫需要小心謹慎。簡單的使用引用比較還是比較簡單安全的,值比較則會變復雜。相等必須是對稱的,約定List只能和其它List相等,Set亦然。所以你自己實現的Collection類在和List、Set比較時應該返回false,因為即使你定制的Collection可以返回true,但是從List的視角來比較,返回的是false,不滿足對稱性。因此,也無法正確的實現一個既有List接口,又有Set接口的類。
遵照約定,如果你重寫了equals方法,那么你要同時重寫hashCode方法。c1.equals(c2)成立,則c1.hashCode()==c2.hashCode()。
Spliterator和StreamSpliterator接口在Java8中引入,這個單詞是Split和iterator的合成,用來分割集合以給并行處理提供方便。看個例子:
public class Ripper { public static void main(String[] args) { Collectionnumbers = new ArrayList<>(); for (int i = 0; i < 10; i++) { numbers.add(i); } Spliterator sp = numbers.spliterator(); System.out.println(sp.characteristics()); System.out.println(sp.estimateSize()); Spliterator sp2=sp.trySplit(); System.out.println(sp.estimateSize()); System.out.println(sp2.estimateSize()); Spliterator sp3=sp.trySplit(); System.out.println(sp.estimateSize()); System.out.println(sp3.estimateSize()); sp3. } }
運行結果:
16464 10 5 5 3 2
相較于傳統的iterator,spliterator可以遞歸的對集合進行劃分,每個spliterator管理了原來集合中的部分元素。但是,每個spliterator并不是線程安全的,所以并行處理時,要保證每一個劃分在同一個線程中進行處理。
Collection提供Stream對元素進行流處理,其中用到了spliterator。看個例子:
public class Ripper { public static void main(String[] args) { Collectionnumbers = new ArrayList<>(); for (int i = 0; i < 10; i++) { numbers.add(i); } Stream stream = numbers.stream(); List filterNum=stream.filter(item -> item > 5).collect(Collectors.toList()); for(Integer i:filterNum){ System.out.print(i+" "); } filterNum.set(0,100); System.out.println(); for(Integer i:numbers){ System.out.print(i+" "); } } }
結果:
6 7 8 9 0 1 2 3 4 5 6 7 8 9
集合經過兩步處理,過濾出了所有符合條件的元素。Stream整體處理過程分為兩步:1.Configuration,2.Processing。Filter是Configuration,collect是Processing。還可以看出一點,最后獲取的結果List是一個新建的List,并不和原List共享內存中的元素。
再看一個reduce的例子:
public class Ripper { public static void main(String[] args) { Collectionnumbers = new ArrayList<>(); for (int i = 0; i < 10; i++) { numbers.add(i); } Stream stream = numbers.stream(); int result=stream.reduce(0, (acc, item) -> acc + item); System.out.println(result); } }
結果是:45。這是一個求和運算,其中第一個參數0是acc的初始值,acc表示上一步(acc, item) -> acc + item的結果,item是每次從stream中取的值。這些Configuration并不立即執行,而是等到最后一個Processing函數,統一執行。
在Collection中有parallelStream提供并行運算,并且使用了默認的spliterator對集合進行劃分。例子如下:
public class Ripper { public static void main(String[] args) { Collectionnumbers = new ArrayList<>(); for (int i = 0; i < 10; i++) { numbers.add(i); } Stream stream = numbers.parallelStream(); stream.forEach(item -> System.out.print(item+" ")); System.out.println(); stream=numbers.stream(); stream.forEach(item -> System.out.print(item+" ")); } }
結果:
1 2 6 8 0 4 3 5 9 7 0 1 2 3 4 5 6 7 8 9
可見,并行運算無法保證每個元素被處理的順序。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/67736.html
摘要:說到復盤基礎,并不是所有的都會復盤,沒那個時間更沒那個必要。比如,一些基礎的語法以及條件語句,極度簡單。思前想后,我覺得整個計劃應該從集合開始,而復盤的方式就是讀源碼。通常,隊列不允許隨機訪問隊列中的元素。 ?showImg(https://segmentfault.com/img/remote/1460000020029737?w=1080&h=711); 老讀者都知道,我是自學轉行...
摘要:隨機訪問數據是相對于順序訪問數據而言,例如鏈表的形式。方法將容器中的元素轉化為數組的形式。在函數中,對容量每次擴展的大小,并且會檢查是否會超過設定的最大數組長度。如果長度超過了限定值,則以原容量為底線,返回一個最大容量。 ArrayList繼承自AbstractList,AbstractList為random access的數組提供了基本的實現。隨機訪問數據是相對于順序訪問數據而言,例...
前言 聲明,本文使用的是JDK1.8 從今天開始正式去學習Java基礎中最重要的東西--->集合 無論在開發中,在面試中這個知識點都是非常非常重要的,因此,我在此花費的時間也是很多,得參閱挺多的資料,下面未必就做到日更了... 當然了,如果講得有錯的地方還請大家多多包涵并不吝在評論去指正~ 一、集合(Collection)介紹 1.1為什么需要Collection Java是一門面向對象的語言,...
摘要:說一說迭代器通過集合對象獲取其對應的對象判斷是否存在下一個元素取出該元素并將迭代器對象指向下一個元素取出元素的方式迭代器。對于使用容器者而言,具體的實現不重要,只要通過容器獲取到該實現的迭代器的對象即可,也就是方法。 前言 歡迎關注微信公眾號:Coder編程獲取最新原創技術文章和相關免費學習資料,隨時隨地學習技術知識!** 本章主要介紹Collection集合相關知識,結合面試中會提到...
摘要:容器相關的操作及其源碼分析說明本文是基于分析的。通常,我們通過迭代器來遍歷集合。是接口所特有的,在接口中,通過返回一個對象。為了偷懶啊,底層使用了迭代器。即返回的和原在元素上保持一致,但不可修改。 容器相關的操作及其源碼分析 說明 1、本文是基于JDK 7 分析的。JDK 8 待我工作了得好好研究下。Lambda、Stream。 2、本文會貼出大量的官方注釋文檔,強迫自己學英語,篇幅...
閱讀 1306·2021-11-16 11:44
閱讀 3774·2021-10-09 10:01
閱讀 1767·2021-09-24 10:31
閱讀 3855·2021-09-04 16:41
閱讀 2527·2021-08-09 13:45
閱讀 1225·2019-08-30 14:08
閱讀 1790·2019-08-29 18:32
閱讀 1651·2019-08-26 12:12