摘要:集合類關(guān)系是和的父接口。相等必須是對(duì)稱的,約定只能和其它相等,亦然。和接口在中引入,這個(gè)單詞是和的合成,用來分割集合以給并行處理提供方便。這些并不立即執(zhí)行,而是等到最后一個(gè)函數(shù),統(tǒng)一執(zhí)行。
集合類關(guān)系:
Collection ├List │├LinkedList │├ArrayList │└Vector │ └Stack └Set Map ├Hashtable ├HashMap └WeakHashMapCollection
java.util.Collection
Collection是List和Set的父接口。它繼承了Iterable接口,所以每個(gè)Collection的子類應(yīng)該是可以迭代訪問其中的元素的。
我注意到一個(gè)有意思的函數(shù),該函數(shù)在Java1.8中引入。該函數(shù)的功能是從集合中刪除所有滿足條件的元素,代碼實(shí)現(xiàn)平平無奇,主要是函數(shù)有一個(gè)default修飾。Java8提供了default讓接口中也可以實(shí)現(xiàn)方法體,目的是為了讓開發(fā)者在給interface添加新方法時(shí),不必再一一修改實(shí)現(xiàn)該接口的類,這些類可以使用默認(rèn)的方法實(shí)現(xiàn)。
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方法的重寫需要小心謹(jǐn)慎。簡(jiǎn)單的使用引用比較還是比較簡(jiǎn)單安全的,值比較則會(huì)變復(fù)雜。相等必須是對(duì)稱的,約定List只能和其它List相等,Set亦然。所以你自己實(shí)現(xiàn)的Collection類在和List、Set比較時(shí)應(yīng)該返回false,因?yàn)榧词鼓愣ㄖ频腃ollection可以返回true,但是從List的視角來比較,返回的是false,不滿足對(duì)稱性。因此,也無法正確的實(shí)現(xiàn)一個(gè)既有List接口,又有Set接口的類。
遵照約定,如果你重寫了equals方法,那么你要同時(shí)重寫hashCode方法。c1.equals(c2)成立,則c1.hashCode()==c2.hashCode()。
Spliterator和StreamSpliterator接口在Java8中引入,這個(gè)單詞是Split和iterator的合成,用來分割集合以給并行處理提供方便。看個(gè)例子:
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. } }
運(yùn)行結(jié)果:
16464 10 5 5 3 2
相較于傳統(tǒng)的iterator,spliterator可以遞歸的對(duì)集合進(jìn)行劃分,每個(gè)spliterator管理了原來集合中的部分元素。但是,每個(gè)spliterator并不是線程安全的,所以并行處理時(shí),要保證每一個(gè)劃分在同一個(gè)線程中進(jìn)行處理。
Collection提供Stream對(duì)元素進(jìn)行流處理,其中用到了spliterator。看個(gè)例子:
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+" "); } } }
結(jié)果:
6 7 8 9 0 1 2 3 4 5 6 7 8 9
集合經(jīng)過兩步處理,過濾出了所有符合條件的元素。Stream整體處理過程分為兩步:1.Configuration,2.Processing。Filter是Configuration,collect是Processing。還可以看出一點(diǎn),最后獲取的結(jié)果List是一個(gè)新建的List,并不和原List共享內(nèi)存中的元素。
再看一個(gè)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); } }
結(jié)果是:45。這是一個(gè)求和運(yùn)算,其中第一個(gè)參數(shù)0是acc的初始值,acc表示上一步(acc, item) -> acc + item的結(jié)果,item是每次從stream中取的值。這些Configuration并不立即執(zhí)行,而是等到最后一個(gè)Processing函數(shù),統(tǒng)一執(zhí)行。
在Collection中有parallelStream提供并行運(yùn)算,并且使用了默認(rèn)的spliterator對(duì)集合進(jìn)行劃分。例子如下:
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+" ")); } }
結(jié)果:
1 2 6 8 0 4 3 5 9 7 0 1 2 3 4 5 6 7 8 9
可見,并行運(yùn)算無法保證每個(gè)元素被處理的順序。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/67736.html
摘要:說到復(fù)盤基礎(chǔ),并不是所有的都會(huì)復(fù)盤,沒那個(gè)時(shí)間更沒那個(gè)必要。比如,一些基礎(chǔ)的語法以及條件語句,極度簡(jiǎn)單。思前想后,我覺得整個(gè)計(jì)劃應(yīng)該從集合開始,而復(fù)盤的方式就是讀源碼。通常,隊(duì)列不允許隨機(jī)訪問隊(duì)列中的元素。 ?showImg(https://segmentfault.com/img/remote/1460000020029737?w=1080&h=711); 老讀者都知道,我是自學(xué)轉(zhuǎn)行...
摘要:隨機(jī)訪問數(shù)據(jù)是相對(duì)于順序訪問數(shù)據(jù)而言,例如鏈表的形式。方法將容器中的元素轉(zhuǎn)化為數(shù)組的形式。在函數(shù)中,對(duì)容量每次擴(kuò)展的大小,并且會(huì)檢查是否會(huì)超過設(shè)定的最大數(shù)組長(zhǎng)度。如果長(zhǎng)度超過了限定值,則以原容量為底線,返回一個(gè)最大容量。 ArrayList繼承自AbstractList,AbstractList為random access的數(shù)組提供了基本的實(shí)現(xiàn)。隨機(jī)訪問數(shù)據(jù)是相對(duì)于順序訪問數(shù)據(jù)而言,例...
前言 聲明,本文使用的是JDK1.8 從今天開始正式去學(xué)習(xí)Java基礎(chǔ)中最重要的東西--->集合 無論在開發(fā)中,在面試中這個(gè)知識(shí)點(diǎn)都是非常非常重要的,因此,我在此花費(fèi)的時(shí)間也是很多,得參閱挺多的資料,下面未必就做到日更了... 當(dāng)然了,如果講得有錯(cuò)的地方還請(qǐng)大家多多包涵并不吝在評(píng)論去指正~ 一、集合(Collection)介紹 1.1為什么需要Collection Java是一門面向?qū)ο蟮恼Z言,...
摘要:說一說迭代器通過集合對(duì)象獲取其對(duì)應(yīng)的對(duì)象判斷是否存在下一個(gè)元素取出該元素并將迭代器對(duì)象指向下一個(gè)元素取出元素的方式迭代器。對(duì)于使用容器者而言,具體的實(shí)現(xiàn)不重要,只要通過容器獲取到該實(shí)現(xiàn)的迭代器的對(duì)象即可,也就是方法。 前言 歡迎關(guān)注微信公眾號(hào):Coder編程獲取最新原創(chuàng)技術(shù)文章和相關(guān)免費(fèi)學(xué)習(xí)資料,隨時(shí)隨地學(xué)習(xí)技術(shù)知識(shí)!** 本章主要介紹Collection集合相關(guān)知識(shí),結(jié)合面試中會(huì)提到...
摘要:容器相關(guān)的操作及其源碼分析說明本文是基于分析的。通常,我們通過迭代器來遍歷集合。是接口所特有的,在接口中,通過返回一個(gè)對(duì)象。為了偷懶啊,底層使用了迭代器。即返回的和原在元素上保持一致,但不可修改。 容器相關(guān)的操作及其源碼分析 說明 1、本文是基于JDK 7 分析的。JDK 8 待我工作了得好好研究下。Lambda、Stream。 2、本文會(huì)貼出大量的官方注釋文檔,強(qiáng)迫自己學(xué)英語,篇幅...
閱讀 1293·2021-11-16 11:44
閱讀 3759·2021-10-09 10:01
閱讀 1745·2021-09-24 10:31
閱讀 3833·2021-09-04 16:41
閱讀 2510·2021-08-09 13:45
閱讀 1210·2019-08-30 14:08
閱讀 1776·2019-08-29 18:32
閱讀 1640·2019-08-26 12:12