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

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值