成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Java 集合 Collection、Iterator

harryhappy / 1871人閱讀

摘要:如果需要?jiǎng)?chuàng)建對(duì)象,則必須與一個(gè)被迭代的集合。這是一個(gè)有狀態(tài)的方法該方法用于保證對(duì)該流的后續(xù)訪問(wèn)中最大允許訪問(wèn)的元素個(gè)數(shù)??梢詫?duì)集合元素進(jìn)行整體的聚集操作。

Java集合分為Set(無(wú)序、不可重復(fù))、List(有序、重復(fù))、Queue(隊(duì)列)和Map(映射關(guān)系)

Java集合概述

數(shù)組元素既可以是基本類型的值,也可以是對(duì)象(實(shí)際保存對(duì)象的引用變量)
集合只能保存對(duì)象(實(shí)際保存對(duì)象的引用變量)

Collection和Map是Java集合框架的根接口

Collection集合體系的繼承樹(shù)

Map體系的繼承樹(shù)

所有的Map實(shí)現(xiàn)類用于保存具有映射關(guān)系的數(shù)據(jù),Map保存的每項(xiàng)數(shù)據(jù)都是key-value對(duì)。
Map里的key是不可重復(fù)的,用于標(biāo)識(shí)集合里的每項(xiàng)數(shù)據(jù),如果需要查閱Map中的數(shù)據(jù)時(shí),總是根據(jù)Map的key來(lái)獲取

Collection和Iterator接口

Collection接口是List、Set和Queue接口的父接口,定義了如下操作集合元素的方法

boolean add(Object o):該方法用于向集合里添加一個(gè)元素。如果集合對(duì)象被添加操作改變了,則返回true

boolean addAll(Collection c):該方法把集合c里的所有元素添加到指定集合里。如果集合對(duì)象被添加操作改變了,則返回true

void clear():清除集合里的所有元素,將集合長(zhǎng)度變?yōu)?

boolean contains(Object o):返回集合里是否包含指定元素

boolean containsAll(Collection c):返回集合里是否包含集合c里的所有元素

boolean isEmpty():返回集合是否為空,當(dāng)集合長(zhǎng)度為0時(shí)返回true,否則返回false

Iterator iterator():返回一個(gè)Iterator對(duì)象,用于遍歷集合里的元素

boolean remove(Object o):刪除集合中的指定元素o,當(dāng)集合中包含了一個(gè)或多個(gè)元素o時(shí),該方法只刪除第一個(gè)符合條件的元素,該方法將返回true

boolean removeAll(Collection c):從集合中刪除集合c里包含的所有元素(相當(dāng)于調(diào)用該方法的集合減集合c),如果刪除了一個(gè)或一個(gè)以上的元素,則返回true

boolean retainAll(Collection c):從集合中刪除集合c里不包含的元素(相當(dāng)于把調(diào)用該方法的集合和集合c的交集),如果該操作改變了調(diào)用該方法的集合,則該方法返回true

int size():該方法返回集合里元素的個(gè)數(shù)

Object[] toArray():該方法把集合轉(zhuǎn)換成一個(gè)數(shù)組,所有的集合元素變成對(duì)應(yīng)的數(shù)組元素

下面程序創(chuàng)建了兩個(gè)Collection對(duì)象,一個(gè)是ArrayList的collection集合,另一個(gè)是HashSet的number集合。雖然實(shí)現(xiàn)類不同,但當(dāng)成Collection來(lái)使用時(shí),操作集合元素沒(méi)有任何區(qū)別

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;

public class CollectionTest 
{
    public static void main(String[] args) 
    {
        Collection collection = new ArrayList<>(); 
        //添加元素
        collection.add("杜蘭特");
        //雖然集合里不能放基本類型的值,但Java支持自動(dòng)裝箱
        collection.add(35);
        System.out.println("collection集合的元素個(gè)數(shù)為:" + collection.size());        //輸出2
        //刪除指定元素
        collection.remove(35);
        System.out.println("collection集合的元素個(gè)數(shù)為:" + collection.size());        //輸出1    
        //判斷是否包含指定字符串
        System.out.println("collection集合是否包含"杜蘭特"字符串:"
                + collection.contains("杜蘭特"));                                    //輸出true
        collection.add("維斯布魯克");
        System.out.println("collection集合的元素:" + collection);
        Collection number = new HashSet<>();
        number.add(35);
        number.add(0);
        System.out.println("collection集合是否完全包含number集合?" + collection.containsAll(number));        //輸出false
        //用collection集合減去number集合里的元素
        collection.removeAll(number);
        System.out.println("collection集合的元素:" + collection);
        //刪除collection集合里的所有元素
        collection.clear();
        System.out.println("collection集合的元素:" + collection);
        //控制number集合里只剩下collection集合里也包含的元素
        number.retainAll(collection);
        System.out.println("number集合的元素:" + number);
    }
}


collection集合的元素個(gè)數(shù)為:2    
collection集合的元素個(gè)數(shù)為:1
collection集合是否包含"杜蘭特"字符串:true
collection集合的元素:[杜蘭特, 維斯布魯克]
collection集合是否完全包含number集合?false
collection集合的元素:[杜蘭特, 維斯布魯克]
collection集合的元素:[]
number集合的元素:[]
使用Lambda表達(dá)式遍歷集合

Iterable接口的forEach(Consumer action)默認(rèn)方法,該方法需要參數(shù)的類型是一個(gè)函數(shù)式接口,而Iterable接口是Collection接口的父接口,因此Collection集合可直接調(diào)用該方法

import java.util.Collection;
import java.util.HashSet;

public class CollectionEach 
{
    public static void main(String[] args)
    {
        //創(chuàng)建一個(gè)集合
        Collection teams = new HashSet<>();
        teams.add("Thunder");
        teams.add("Cavaliers");
        teams.add("Warriors");
        //調(diào)用forEach()方法遍歷集合
        teams.forEach(obj -> System.out.println("迭代集合元素: " + obj));
    }
}

程序調(diào)用Iterable的forEach(Consumer action)遍歷集合元素是,程序會(huì)依次將集合元素傳給Consumer的accept(T t)方法(該接口中唯一的抽象方法)

使用Java8增強(qiáng)的Iterator遍歷集合元素

Iterator主要用于遍歷(即迭代訪問(wèn))Collection集合中的元素,Iterator對(duì)象也被稱為迭代器

boolean hasNext():如果被迭代的集合元素還沒(méi)有被遍歷完,則返回true

Object next():返回集合里的下一個(gè)元素

void remove():刪除集合里上一次next方法返回的元素

void forEachRemaining(Consumer action):該方法可以使用Lambda表達(dá)式來(lái)遍歷集合元素

Iterator僅用于遍歷集合,Iterator本身并不提供盛裝對(duì)象的能力。如果需要?jiǎng)?chuàng)建Iterator對(duì)象,則必須與一個(gè)被迭代的集合。當(dāng)使用Iterator對(duì)集合元素進(jìn)行迭代時(shí),Iterator并不是把集合元素本身傳給了迭代變量,而是把集合元素的值傳給了迭代變量,所以修改迭代變量的值對(duì)集合元素本身沒(méi)有任何影響

//獲取teams集合對(duì)應(yīng)的迭代器
Iterator iterator = teams.iterator();
while (iterator.hasNext())
{
    //iterator.next()方法返回的數(shù)據(jù)類型是Object類型,因此需要強(qiáng)制類型轉(zhuǎn)換
    String team = (String) iterator.next();
    System.out.println(team);
    if (team.equals("Cavaliers")) 
    {
        //從集合中刪除上一次next()方法返回的元素
        iterator.remove();
    }
    //對(duì)iterator變量賦值,不會(huì)改變集合元素本身
    team = "Rocket";        //①
}
System.out.println(teams);

當(dāng)使用Iterator迭代訪問(wèn)Collection集合元素時(shí),Collection集合里的元素不能被改變,只有通過(guò)Iterator的remove()方法刪除上一次next()方法返回的集合元素才可以;否則將會(huì)引發(fā)java.util.ConcurrentModificationException異常

使用Lambda表達(dá)式遍歷Iterator
//獲取teams集合對(duì)應(yīng)的迭代器
Iterator iterator = teams.iterator();
//使用Lambda表達(dá)式(目標(biāo)類型是Comsumer)來(lái)遍歷集合元素
iterator.forEachRemaining(obj -> System.out.println("迭代集合元素: " + obj));
使用foreach循環(huán)遍歷集合元素

使用foreach循環(huán)來(lái)迭代訪問(wèn)Collection集合里的元素更加簡(jiǎn)潔,迭代變量不是集合元素本身,系統(tǒng)只是依次把集合元素的值賦給迭代變量,集合也不能被改變,否則引發(fā)ConcurrentModificationException異常

import java.util.*;

public class ForeachTest
{
    public static void main(String[] args)
    {
        // 創(chuàng)建集合、添加元素的代碼與前一個(gè)程序相同
        Collection books = new HashSet();
        books.add(new String("輕量級(jí)Java EE企業(yè)應(yīng)用實(shí)戰(zhàn)"));
        books.add(new String("瘋狂Java講義"));
        books.add(new String("瘋狂Android講義"));
        for (Object obj : books)
        {
            // 此處的book變量也不是集合元素本身
            String book = (String)obj;
            System.out.println(book);
            if (book.equals("瘋狂Android講義"))
            {
                // 下面代碼會(huì)引發(fā)ConcurrentModificationException異常
                books.remove(book);     //①
            }
        }
        System.out.println(books);
    }
}
使用Java8新增的Predicate操作集合

removif(Predicate filter)方法,該方法將會(huì)批量刪除符合filter條件的所有元素。該方法需要一個(gè)Predicate(謂詞)對(duì)象作為參數(shù),Predicate也是函數(shù)式接口,因此可使用Lambda表達(dá)式作為參數(shù)

import java.util.*;
import java.util.function.*;

public class PredicateTest2
{
    public static void main(String[] args)
    {
        // 創(chuàng)建books集合、為books集合添加元素的代碼與前一個(gè)程序相同。
        Collection books = new HashSet();
        books.add(new String("輕量級(jí)Java EE企業(yè)應(yīng)用實(shí)戰(zhàn)"));
        books.add(new String("瘋狂Java講義"));
        books.add(new String("瘋狂iOS講義"));
        books.add(new String("瘋狂Ajax講義"));
        books.add(new String("瘋狂Android講義"));
        // 統(tǒng)計(jì)書(shū)名包含“瘋狂”子串的圖書(shū)數(shù)量
        System.out.println(calAll(books , ele->((String)ele).contains("瘋狂")));
        // 統(tǒng)計(jì)書(shū)名包含“Java”子串的圖書(shū)數(shù)量
        System.out.println(calAll(books , ele->((String)ele).contains("Java")));
        // 統(tǒng)計(jì)書(shū)名字符串長(zhǎng)度大于10的圖書(shū)數(shù)量
        System.out.println(calAll(books , ele->((String)ele).length() > 10));
    }
    public static int calAll(Collection books , Predicate p)
    {
        int total = 0;
        for (Object obj : books)
        {
            // 使用Predicate的test()方法判斷該對(duì)象是否滿足Predicate指定的條件
            if (p.test(obj))
            {
                total ++;
            }
        }
        return total;
    }
}
使用Java8新增的Stream操作集合

獨(dú)立使用Stream的步驟

使用Stream或XxxStream的builder()類方法創(chuàng)建該Stream對(duì)應(yīng)的Builder

重復(fù)調(diào)用Builder的add()方法向該流中添加多個(gè)元素

調(diào)用Builder的build()方法獲取對(duì)應(yīng)的Stream

調(diào)用Stream的聚集方法

Stream提供了大量的聚集方法供用戶調(diào)用,對(duì)于大部分聚集方法而言,每個(gè)Stream只能執(zhí)行一次

import java.util.stream.IntStream;

import javax.lang.model.element.Element;
import javax.print.attribute.standard.PrinterLocation;
import javax.swing.text.html.HTMLDocument.HTMLReader.IsindexAction;

public class IntStreamTest 
{
    public static void main(String[] args) 
    {
        IntStream is = IntStream.builder()
                .add(20)
                .add(16)
                .add(12)
                .add(22)
                .build();
        //下面調(diào)用聚集方法的代碼每次只能執(zhí)行一行
        System.out.println("is所有元素的最大值:" + is.max().getAsInt());
        System.out.println("is所有元素的最小值:" + is.min().getAsInt());
        System.out.println("is所有元素的總和:" + is.sum());
        System.out.println("is所有元素的總數(shù):" + is.count());
        System.out.println("is所有元素的平均值:" + is.average());
        System.out.println("is所有元素的平方是否都大于20:" + is.allMatch(ele -> ele * ele > 20));
        System.out.println("is是否包含任何元素的平方大于20:" + is.anyMatch(ele -> ele * ele > 20));
        //將is映射成一個(gè)新Stream,新Stream的每個(gè)元素是原Stream元素的2倍+1
        IntStream newIs =  is.map(ele -> ele * 2 + 1);
        //使用方法引用的方式來(lái)遍歷集合元素
        newIs.forEach(System.out::println);
    }
}

使用流的時(shí)候應(yīng)當(dāng)格外注意,它只能消費(fèi)一次。上述聚集方法執(zhí)行操作每次只能執(zhí)行一行,否則出現(xiàn)java.lang.IllegalStateException: stream has already been operated upon or closed

Stream提供了大量的方法進(jìn)行聚集操作,這些方法既可以是“中間的”(intermediate),也可以是“末端的”(terminal)

中間方法:中間操作允許流保持打開(kāi)狀態(tài),并允許直接調(diào)用后續(xù)方法。map()方法就是中間方法。中間方法的返回值是另外一個(gè)流

末端方法:末端方法是對(duì)流的最終操作。當(dāng)對(duì)某個(gè)Stream執(zhí)行末端方法后,該流就會(huì)被“消耗”且不再可用。sum()、count()、average()等方法都是末端方法。

流方法的兩個(gè)特征

有狀態(tài)的方法:該方法會(huì)給流增加一些新的屬性,比如元素的唯一性、元素的最大數(shù)量、保證元素以排序的方式被處理等。有狀態(tài)的方法往往需要更大的性能開(kāi)銷(xiāo)

短路方法:可以盡早結(jié)束對(duì)流的操作,不必檢查所有的元素

常用中間方法

filter(Predicate predicate):過(guò)濾Stream中所有不符合predicate的元素

mapToXxx(ToXxxFunction mapper):使用ToXxxFunction對(duì)流中的元素執(zhí)行一對(duì)一的轉(zhuǎn)換,該方法返回的新流中包含了ToXxxFunction轉(zhuǎn)換生成的所有元素

peek(Consumer action):依次對(duì)每個(gè)元素執(zhí)行一些操作,該方法返回的流與原有流包含相同的元素。主要用于調(diào)試

distinct():該方法用于排序流中所有重復(fù)的元素(判斷元素重復(fù)的標(biāo)準(zhǔn)是使用equals()比較返回true)。這是一個(gè)有狀態(tài)的方法

sorted():該方法用于保證流中的元素在后續(xù)的訪問(wèn)中處于有序狀態(tài)。這是一個(gè)有狀態(tài)的方法

limit(long maxSize):該方法用于保證對(duì)該流的后續(xù)訪問(wèn)中最大允許訪問(wèn)的元素個(gè)數(shù)。這是一個(gè)有狀態(tài)的、短路方法

forEach(Consumer action):遍歷流中所有元素,對(duì)每個(gè)元素執(zhí)行action

toArray():將流中所有元素轉(zhuǎn)換為一個(gè)數(shù)組

reduce():該方法有三個(gè)重載版本,都用于通過(guò)某種操作來(lái)合并流中的元素

min():返回流中所有元素的最小值

max():返回流中所有元素的最大值

count():返回流中所有元素的數(shù)量

anyMatch(Predicate predicate):判斷流中是否至少包含一個(gè)元素符合Predicate條件

allMatch(Predicate predicate):判斷流中是否每個(gè)元素都符合Predicate條件

noneMatch(Predicate predicate):判斷流中是否所有元素都不符合Predicate條件

findFirst():返回流中的第一個(gè)元素

findAny():返回流中的任意一個(gè)元素

Java8允許使用流式API來(lái)操作集合,Collection接口提供了一個(gè)stream()默認(rèn)方法可返回該集合對(duì)應(yīng)的流,接下來(lái)即可通過(guò)流式API來(lái)操作集合元素。Stream可以對(duì)集合元素進(jìn)行整體的聚集操作。

public class CollectionStream 
{
    public static void main(String[] args) 
    {
        Collection player = new HashSet<>();
        player.add(new String("FMVP+MVP勒布朗詹姆斯"));
        player.add(new String("MVP德里克羅斯"));
        player.add(new String("MVP斯蒂芬?guī)炖?));
        player.add(new String("MVP德凱文杜蘭特"));
        player.add(new String("FMVP萊昂納德"));
        player.add(new String("場(chǎng)均三雙狂魔維斯布魯克"));
        
        //統(tǒng)計(jì)書(shū)名包含“MVP”子串的圖書(shū)數(shù)量
        System.out.println(player.stream().
                filter(ele -> ((String)ele).contains("MVP"))
                .count());            // 輸出5
        //統(tǒng)計(jì)書(shū)名包含“FMVP”子串的圖書(shū)數(shù)量
        System.out.println(player.stream().
                filter(ele -> ((String)ele).contains("FMVP"))
                .count());            // 輸出2
        //統(tǒng)計(jì)書(shū)名字符串長(zhǎng)度大于10的圖書(shū)數(shù)量
        System.out.println(player.stream().
                filter(ele -> ((String)ele).length() > 10)
                .count());            // 輸出2
        //先調(diào)用Collection對(duì)象的stream()方法將集合轉(zhuǎn)換為Stream
        //再調(diào)用Stream的mapToInt()方法獲取原有的Stream對(duì)應(yīng)的IntStream
        player.stream().mapToInt(ele -> ((String)ele).length())
        //調(diào)用forEach()方法遍歷IntStream中每個(gè)元素
        .forEach(System.out::println);            // 輸出8.14.8.8.9.11
    }
}

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/66383.html

相關(guān)文章

  • java集合

    摘要:主要用于遍歷集合中的元素,對(duì)象也被稱為迭代器。使用迭代過(guò)程中,不可修改集合元素迭代器采用快速失敗機(jī)制。一旦迭代過(guò)程中檢測(cè)到該集合已經(jīng)被修改,程序立即出發(fā)異常,而不是顯示修改后的結(jié)果,避免了共享資源而引發(fā)的潛在問(wèn)題。 集合類和數(shù)組不一樣,數(shù)組元素既可以是基本類型的值,也可以是對(duì)象(實(shí)際上保存的是對(duì)象的引用變量);而集合里只能保存對(duì)象(實(shí)際上只是保存對(duì)象的引用變量,但通常習(xí)慣上認(rèn)為集...

    JinB 評(píng)論0 收藏0
  • 集合概要學(xué)習(xí)---粗略

    摘要:集合框架的基本接口類層次結(jié)構(gòu)其中表示接口,表示實(shí)現(xiàn)類和在實(shí)際開(kāi)發(fā)中,需要將使用的對(duì)象存儲(chǔ)于特定數(shù)據(jù)結(jié)構(gòu)的容器中。實(shí)例是迭代器,擁有兩個(gè)方法方法迭代器用于遍歷集合元素。返回值則是轉(zhuǎn)換后的數(shù)組,該數(shù)組會(huì)保存集合中的所有元素。 Java Collections Framework是Java提供的對(duì)集合進(jìn)行定義,操作,和管理的包含一組接口,類的體系結(jié)構(gòu)。 Java集合框架的基本接口/類層次結(jié)構(gòu)...

    DesGemini 評(píng)論0 收藏0
  • java集合--Collection接口

    摘要:集合的元素個(gè)數(shù)為輸出集合的元素個(gè)數(shù)為在本代碼中,新建一個(gè)局部變量保存的成員方法返回的值,輸出得到因?yàn)橹挥幸粋€(gè)元素。注若遍歷集合的同時(shí)改變集合,將引發(fā)異常。 ????在概述里面也說(shuō)過(guò):Collection是java集合兩大接口之一,旗下有三大子接口:Set(元素不能重復(fù),且無(wú)序)、Queue、List(元素可重復(fù),且有序)。????Collection來(lái)源于java.util包,主要方法...

    k00baa 評(píng)論0 收藏0
  • Java集合遍歷

    摘要:集合的遍歷使用主要用于遍歷集合中的元素,因此創(chuàng)建的對(duì)象是一個(gè)迭代器。提供的四個(gè)方法如果迭代器的集合還沒(méi)有被遍歷完,返回。 集合的遍歷 使用Iterator Iterator主要用于遍歷集合中的Collection元素,因此Iterator創(chuàng)建的對(duì)象是一個(gè)迭代器。 Iterator提供的四個(gè)方法 boolean hasNext(): 如果迭代器的集合還沒(méi)有被遍歷完,返回ture。 Ob...

    MadPecker 評(píng)論0 收藏0
  • java集合和泛型的知識(shí)點(diǎn)歸納1

    摘要:接口也是集合中的一員,但它與接口有所不同,接口與接口主要用于存儲(chǔ)元素,而主要用于迭代訪問(wèn)即遍歷中的元素,因此對(duì)象也被稱為迭代器。迭代器的實(shí)現(xiàn)原理我們?cè)谥鞍咐呀?jīng)完成了遍歷集合的整個(gè)過(guò)程。 【Collection、泛型】 主要內(nèi)容 Collection集合 迭代器 增強(qiáng)for 泛型 教學(xué)目標(biāo) [ ] 能夠說(shuō)出集合與數(shù)組的區(qū)別 [ ] 說(shuō)出Collection集合的常用功能 [ ]...

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

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

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<