Java 集合遍歷

2018-09-22 19:09 更新

Java集合教程 - Java集合遍歷


在Java Collections Framework中,不同類(lèi)型的集合使用不同類(lèi)型的數(shù)據(jù)結(jié)構(gòu)以不同的方式存儲(chǔ)它們的元素。

一些集合對(duì)它們的元素有排序,有些沒(méi)有。集合框架提供了遍歷集合的以下方法:

  • 使用迭代器
  • 使用for-each循環(huán)
  • 使用forEach()方法

使用迭代器

集合提供了一個(gè)迭代器來(lái)遍歷其所有元素。

迭代器可以對(duì)集合執(zhí)行以下三個(gè)操作:

  • 檢查是否有尚未訪(fǎng)問(wèn)的元素。
  • 訪(fǎng)問(wèn)集合中的下一個(gè)元素。
  • 刪除集合的最后訪(fǎng)問(wèn)元素。

Java中的迭代器是 Iterator< E> 接口的一個(gè)實(shí)例。

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

以下代碼創(chuàng)建一個(gè)字符串列表,并獲取列表的迭代器:

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()方法返回集合中的下一個(gè)元素。我們應(yīng)該在調(diào)用 next()方法之前調(diào)用 hasNext()方法。如果沒(méi)有, next()方法會(huì)拋出NoSuchElementException異常。


例子

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

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);
    }

  }
}

上面的代碼生成以下結(jié)果。

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

如果對(duì)于每個(gè) next()方法或在第一次調(diào)用next()之前被多次調(diào)用 remove()方法,它會(huì)拋出一個(gè) IllegalStateException異常。

對(duì) remove()方法的支持是可選的。remove()方法可能會(huì)拋出一個(gè) 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);
  }
}

上面的代碼生成以下結(jié)果。

例3

forEachRemaining()方法對(duì)集合中尚未由迭代器訪(fǎng)問(wèn)的每個(gè)元素執(zhí)行操作。

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);
  }
}

上面的代碼生成以下結(jié)果。

迭代器注意事項(xiàng)

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

要再次遍歷同一集合的元素,請(qǐng)通過(guò)調(diào)用集合的iterator()方法來(lái)創(chuàng)建一個(gè)新的Iterator。

使用for-each循環(huán)

我們可以使用for-each循環(huán)遍歷集合的元素。

我們可以使用for-each循環(huán)遍歷任何實(shí)現(xiàn)類(lèi)實(shí)現(xiàn)Iterable接口的集合。

for-each循環(huán)的一般語(yǔ)法如下:

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

在幕后,for-each循環(huán)獲取迭代器并調(diào)用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);
    }

  }
}

上面的代碼生成以下結(jié)果。

for-each注意事項(xiàng)

for-each循環(huán)有幾個(gè)限制。

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

以下代碼將拋出ConcurrentModificationException異常:

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

對(duì)于for-each循環(huán),我們沒(méi)有辦法從集合的中間開(kāi)始。

for-each循環(huán)不提供訪(fǎng)問(wèn)先前訪(fǎng)問(wèn)的元素的方式。

使用forEach()方法

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

該方法遍歷所有元素并應(yīng)用操作。

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

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);
  }
}

上面的代碼生成以下結(jié)果。


以上內(nèi)容是否對(duì)您有幫助:
在線(xiàn)筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)