Java遍歷集合

  • 使用迭代器

  • 使用for-each循環

  • 使用forEach()方法

 

使用迭代器

集合提供了一個迭代器來遍歷其所有元素。

迭代器可以對集合執行以下三個操作:

  • 檢查是否有尚未訪問的元素。
  • 訪問集合中的下一個元素。
  • 刪除集合的最後訪問元素。

Java中的迭代器是 Iterator< E> 接口的一個實例。

我們可以使用Collection接口中的iterator()方法獲取集合的迭代器。

以下代碼創建一個字符串列表,並獲取列表的迭代器:

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class Main {
  public static void main(String[] args) {
    // Create a list of strings
    List<String> names = new ArrayList<>();

    // Get an iterator for the list
    Iterator<String> nameIterator = names.iterator();
  }
}

迭代器< E> 接口包含以下方法:

boolean hasNext()
E next()
default void  remove()
default void  forEachRemaining(Consumer<? super  E> action)

如果集合中有更多元素要迭代, hasNext()方法將返回true。否則,它返回false。

next()方法返回集合中的下一個元素。我們應該在調用 next()方法之前調用 hasNext()方法。如果沒有, next()方法會拋出NoSuchElementException異常。

 

例子

通常, hasNext() next()方法在循環中一起使用。以下代碼使用迭代器打印列表的所有元素:

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class Main {
  public static void main(String[] args) {
    // Create a list of strings
    List<String> names = new ArrayList<>();
    names.add("A");
    names.add("B");
    names.add("C");
    // Get an iterator for the list
    Iterator<String> nameIterator = names.iterator();
    // Iterate over all elements in the list
    while (nameIterator.hasNext()) {
      // Get the next element from the list
      String name = nameIterator.next();
      System.out.println(name);
    }

  }
}

上面的代碼生成以下結果。

remove()方法刪除 next()方法最後返回的元素。每次調用next()方法只能調用一次 remove()方法。

如果對於每個 next()方法或在第一次調用next()之前被多次調用 remove()方法,它會拋出一個IllegalStateException異常。

 remove()方法的支持是可選的。remove()方法可能會拋出一個UnsupportedOperationException 異常。

例2

以下代碼使用迭代器遍歷列表的所有元素,並使用remove()方法刪除該元素。

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class Main {
  public static void main(String[] args) {
    // Create a list of strings
    List<String> names = new ArrayList<>();
    names.add("A");
    names.add("B");
    names.add("C");

    Iterator<String> nameIterator = names.iterator();
    // Iterate over all elements in the list
    while (nameIterator.hasNext()) {
      // Get the next element from the list
      String name = nameIterator.next();
      System.out.println(name);
      nameIterator.remove();
    }
    System.out.println(names);
  }
}
上面的代碼生成以下結果。

例3

forEachRemaining()方法對集合中尚未由迭代器訪問的每個元素執行操作。

action指定爲 Consumer 

以下代碼顯示如何打印列表的所有元素。

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class Main {
  public static void main(String[] args) {
    // Create a list of strings
    List<String> names = new ArrayList<>();
    names.add("A");
    names.add("B");
    names.add("C");

    Iterator<String> nameIterator = names.iterator();
    nameIterator.forEachRemaining(System.out::println);
  }
}

上面的代碼生成以下結果。

迭代器注意事項

迭代器是一次性對象。我們不能重置迭代器,它不能被重用。

要再次遍歷同一集合的元素,請通過調用集合的iterator()方法來創建一個新的Iterator。

使用for-each循環

我們可以使用for-each循環遍歷集合的元素。

我們可以使用for-each循環遍歷任何實現類實現Iterable接口的集合。

for-each循環的一般語法如下:

Collection<T> yourCollection  = ;
for(T  element : yourCollection)  {
}

在幕後,for-each循環獲取迭代器並調用hasNext()和next()方法。

import java.util.ArrayList;
import java.util.List;

public class Main {
  public static void main(String[] args) {
    // Create a list of strings
    List<String> names = new ArrayList<>();
    names.add("A");
    names.add("B");
    names.add("C");

    for (String name : names) {
      System.out.println(name);
    }

  }
}

for-each注意事項

for-each循環有幾個限制。

我們不能使用for-each循環從集合中刪除元素。

以下代碼將拋出ConcurrentModificationException異常:

List<String> names = get   a  list;
for(String name : names)  {
    names.remove(name);// Throws a  ConcurrentModificationException 
}

對於for-each循環,我們沒有辦法從集合的中間開始。

for-each循環不提供訪問先前訪問的元素的方式。

使用forEach()方法

Iterable接口包含一個新的 forEach(Consumer action)方法。

該方法遍歷所有元素並應用操作。

forEach()方法在從 Collection 接口繼承的所有集合類型中都可用。

import java.util.ArrayList;
import java.util.List;

public class Main {
  public static void main(String[] args) {
    // Create a list of strings
    List<String> names = new ArrayList<>();
    names.add("A");
    names.add("B");
    names.add("C");

    names.forEach(System.out::println);
    names.forEach((s -> {
       System.out.println(s);
    }));
  }
}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章