国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Java容器類研究1:Collection

AprilJ / 2546人閱讀

摘要:集合類關(guān)系是和的父接口。相等必須是對(duì)稱的,約定只能和其它相等,亦然。和接口在中引入,這個(gè)單詞是和的合成,用來分割集合以給并行處理提供方便。這些并不立即執(zhí)行,而是等到最后一個(gè)函數(shù),統(tǒng)一執(zhí)行。

集合類關(guān)系:

Collection   
├List   
│├LinkedList   
│├ArrayList   
│└Vector   
│ └Stack   
└Set   
Map  
├Hashtable  
├HashMap   
└WeakHashMap

Collection

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 filter) {
        Objects.requireNonNull(filter);
        boolean removed = false;
        final Iterator each = iterator();
        while (each.hasNext()) {
            if (filter.test(each.next())) {
                each.remove();
                removed = true;
            }
        }
        return removed;
    }
Collection的equals

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和Stream

Spliterator接口在Java8中引入,這個(gè)單詞是Split和iterator的合成,用來分割集合以給并行處理提供方便。看個(gè)例子:

public class Ripper {
    public static void main(String[] args) {
        Collection numbers = 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) {
        Collection numbers = 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) {
        Collection numbers = 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) {
        Collection numbers = 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

相關(guān)文章

  • Java 基礎(chǔ) | Collection 集合概覽

    摘要:說到復(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)行...

    codergarden 評(píng)論0 收藏0
  • Java容器研究3:AbstractCollection

    摘要:隨機(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ù)而言,例...

    Donald 評(píng)論0 收藏0
  • 集合Collection總覽

    前言 聲明,本文使用的是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言,...

    FullStackDeveloper 評(píng)論0 收藏0
  • 通過面試題,讓我們來了解Collection

    摘要:說一說迭代器通過集合對(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ì)提到...

    HelKyle 評(píng)論0 收藏0
  • 容器Collection、Iterable、List、Vector(Stack)分析(三)

    摘要:容器相關(guān)的操作及其源碼分析說明本文是基于分析的。通常,我們通過迭代器來遍歷集合。是接口所特有的,在接口中,通過返回一個(gè)對(duì)象。為了偷懶啊,底層使用了迭代器。即返回的和原在元素上保持一致,但不可修改。 容器相關(guān)的操作及其源碼分析 說明 1、本文是基于JDK 7 分析的。JDK 8 待我工作了得好好研究下。Lambda、Stream。 2、本文會(huì)貼出大量的官方注釋文檔,強(qiáng)迫自己學(xué)英語,篇幅...

    liaosilzu2007 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<