36.集合:Collection集合的遍歷形式

Collection集合的遍歷形式

方式一:迭代器

迭代器概述

  • 遍歷就是一個(gè)一個(gè)的把容器中的元素訪問(wèn)一遍
  • 迭代器在java中的代表是Iterator,迭代器是集合的專(zhuān)用遍歷方式

迭代器獲取及常用方法

Collection集合獲取迭代器

方法名稱(chēng) 說(shuō)明
Iterator<E> iterator() 返回集合中的迭代器對(duì)象,該迭代器對(duì)象默認(rèn)指向當(dāng)前集合的0索引

Iterator中的常用方法

方法名稱(chēng) 說(shuō)明
boolean hasNext() 詢(xún)問(wèn)當(dāng)前位置是否有元素存在,存在返回true,不存在返回false
E next() 獲取當(dāng)前位置的元素,并同時(shí)將迭代器對(duì)象移向下一個(gè)位置,注意防止取出越界

測(cè)試代碼

package com.java.collection;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

/**
 * 使用迭代器獲取集合元素
 */
public class CollectionDemo03 {
    public static void main(String[] args) {
        Collection<String> lists = new ArrayList<>();
        lists.add("吳亦凡");
        lists.add("華晨宇");
        lists.add("陳冠希");
        lists.add("張柏芝");
        System.out.println(lists);

        // 1. 得到當(dāng)前集合的迭代器對(duì)象
        Iterator<String> it = lists.iterator();
/*      String e = it.next();
        System.out.println(e);
        System.out.println(it.next());*/
        //next()每次成功訪問(wèn)元素后就會(huì)移動(dòng)到下一個(gè)元素的位置,因此要謹(jǐn)防越界問(wèn)題
/*      System.out.println(it.next());
        System.out.println(it.next());*/
        //System.out.println(it.next());  NoSuchElementException,出現(xiàn)無(wú)此元素異常

        // 2.定義While循環(huán),使用hasNext()判斷是否有元素,有就進(jìn)入循環(huán)使用next()取出來(lái)
        while (it.hasNext()) {
            System.out.println(it.next());  
            // 一個(gè)循環(huán)下不能出現(xiàn)兩個(gè)next語(yǔ)句 否則會(huì)因?yàn)閿?shù)組元素是奇數(shù)是發(fā)生如上異常
        }

    }
}

  • 注意事項(xiàng)

    1. next()每次成功訪問(wèn)元素后就會(huì)移動(dòng)到下一個(gè)元素的位置,因此要謹(jǐn)防越界問(wèn)題
    2. 一個(gè)循環(huán)下不能出現(xiàn)兩個(gè)next語(yǔ)句 否則會(huì)因?yàn)閿?shù)組元素是奇數(shù)是發(fā)生如上異常
  • 核心代碼

    // 1. 得到當(dāng)前集合的迭代器對(duì)象
    Iterator<String> it = lists.iterator();
    // 2.定義While循環(huán),使用hasNext()判斷是否有元素,有就進(jìn)入循環(huán)使用next()取出來(lái)
    while (it.hasNext()) {
    System.out.println(it.next());  
    // 一個(gè)循環(huán)下不能出現(xiàn)兩個(gè)next語(yǔ)句 否則會(huì)因?yàn)閿?shù)組元素是奇數(shù)是發(fā)生如上異常
    }
    

方式二:foreach/增強(qiáng)for循環(huán)

增強(qiáng)for循環(huán)概述

  • 增強(qiáng)for循環(huán):既可以遍歷集合,也可以遍歷數(shù)組
  • 它是JDK5之后出現(xiàn)的,其內(nèi)部原理是一個(gè)Iterator迭代器,遍歷集合相當(dāng)于是迭代器的簡(jiǎn)化寫(xiě)法
  • 實(shí)現(xiàn)Iterable接口的類(lèi)才可以使用迭代器和增強(qiáng)for,Collection接口已經(jīng)實(shí)現(xiàn)了Iterable接口

格式

for(元素?cái)?shù)據(jù)類(lèi)型 變量名 : 數(shù)組或者Collection集合){
    // 在此處使用變量即可,這變量就是元素
}

示例

Collection<String> list = new ArrayList<>();
... ...
for(String ele : list){
    System.out.println(ele);
}

測(cè)試代碼

package com.java.collection;

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

/**
 * 使用增強(qiáng)for循環(huán)(又稱(chēng)foreach)獲取集合元素
 */
public class CollectionDemo04 {
    public static void main(String[] args) {
        Collection<String> lists = new ArrayList<>();
        lists.add("吳亦凡");
        lists.add("華晨宇");
        lists.add("陳冠希");
        lists.add("張柏芝");
        System.out.println(lists);

        for (String ele : lists) {
            System.out.println(ele);
        }

        // 嘗試遍歷數(shù)組
        int[] scores = new int[]{100, 200, 300, 400, 500};
        for (int s : scores) {
            System.out.println(s);
        }
    }
}

  • 注意隨事項(xiàng)

    • 對(duì)于增強(qiáng)for循環(huán)而言,以上述測(cè)試代碼中數(shù)組測(cè)試為例:int s 和scores是有區(qū)別的,其中s的作用類(lèi)似于result,起到接收的作用,是單獨(dú)定義存在的變量,和數(shù)組的元素?zé)o關(guān),因此,修改s的值不會(huì)影響到數(shù)組中的內(nèi)容

    • int[] scores = new int[]{100, 200, 300, 400, 500};
      for (int s : scores) {
          System.out.println(s);
          if (s == 200) {
              s = 10;             // 修改無(wú)意義,不會(huì)影響數(shù)組的元素
          }
      }
      System.out.println(Arrays.toString(scores));
      

方式三:Lambda表達(dá)式

  • Collection結(jié)合Lambda遍歷的API

    方法名稱(chēng) 說(shuō)明
    default void forEach(Consumer<? super T> action): 結(jié)合Lambda遍歷集合
  • 測(cè)試代碼

    package com.java.collection;
    
    import java.util.ArrayList;
    import java.util.Collection;
    
    /**
     * 結(jié)合Lambda遍歷集合
     */
    public class CollectionDemo05 {
        public static void main(String[] args) {
            Collection<String> lists = new ArrayList<>();
            lists.add("吳亦凡");
            lists.add("華晨宇");
            lists.add("陳冠希");
            lists.add("張柏芝");
            System.out.println(lists);
    
            // forEach源碼
    /*
            default void forEach(Consumer<? super T> action) {
                Objects.requireNonNull(action);
                for (T t : this) {
                    action.accept(t);
                }
            }
    */
    
    
    /*      lists.forEach(new Consumer<String>() {
                @Override
                public void accept(String s) {
                    System.out.println(s);
                }
            });*/
    
    /*      lists.forEach(s -> {
                    System.out.println(s);
    
            });*/
    
            lists.forEach(s -> System.out.println(s));
    
    
            // 現(xiàn)在的新技術(shù):冒號(hào)引用,將上述代碼繼續(xù)簡(jiǎn)化
            lists.forEach(System.out::println);
        }
    }
    
    
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容