遍历Java中的列表
这篇文章将讨论在 Java 中迭代列表的各种方法。
1.使用 List.toString()
方法
如果我们只是想显示列表的内容,我们可以通过使用 toString()
方法,然后简单地打印出来,如下图:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | import java.util.List; import java.util.ArrayList; import java.util.stream.Stream; class Main { // 用于打印 `ArrayList` 的 Java 程序 public static void main(String[] args) { List<String> list = new ArrayList<String>(); list.add("C"); list.add("C++"); list.add("Java"); // 1. 使用 `toString()` 打印列表的字符串表示 System.out.println(list.toString()); // 2. Java 8 方式! Stream.of(list.toString()) .forEach(System.out::println); } } |
2.使用 ListIterator
或者 Iterator
这 List
接口提供了一个特殊的迭代器,称为 ListIterator,除了正常的操作之外,还允许双向访问 Iterator
接口提供。我们可以打电话 List.listIterator() 得到一个 ListIterator
列表中的元素。我们也可以使用 List.iterator()
返回一个 Iterator
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | import java.util.ArrayList; import java.util.List; import java.util.Iterator; import java.util.ListIterator; import java.util.Arrays; class Main { // 遍历列表的 Java 程序 public static void main(String[] args) { List<String> list = Arrays.asList("C", "C++", "Java"); // 1. 使用 `ListIterator` 遍历列表 ListIterator<String> lItr = list.listIterator(); // 如果列表有更多元素,hasNext() 返回 true while (lItr.hasNext()) { // next() 返回迭代中的下一个元素 System.out.println(lItr.next()); } // 2. 使用迭代器 Iterator<String> itr = list.iterator(); while (itr.hasNext()) { System.out.println(itr.next()); } } } |
通用版本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | import java.util.Arrays; import java.util.Iterator; import java.util.List; import java.util.ListIterator; class Main { // 在 Java 中遍历列表的通用代码 public static <T, C> void IterateUsingIterator(List<T> list, Class<C> iteratorClass) { if (iteratorClass.getSimpleName().equals("ListIterator")) { // 使用 `ListIterator` 遍历列表 ListIterator<T> lItr = list.listIterator(); while (lItr.hasNext()) { System.out.println(lItr.next()); } } else if (iteratorClass.getSimpleName().equals("Iterator")) { // 使用 `Iterator` 遍历列表 Iterator<T> itr = list.iterator(); while (itr.hasNext()) { System.out.println(itr.next()); } } } // 遍历列表的 Java 程序 public static void main(String[] args) { List<String> list = Arrays.asList("C", "C++", "Java"); // 1. 使用 `ListIterator` 打印列表 IterateUsingIterator(list, ListIterator.class); // 2. 使用 `Iterator` 打印列表 IterateUsingIterator(list, Iterator.class); } } |
3.使用for循环/增强for循环
我们知道 list 是一个有序集合,因此我们可以使用 for 循环通过它们在列表中的索引来访问元素。
for 循环还有另一种形式,设计用于通过集合和数组进行迭代,称为增强型 for 循环。我们还可以使用增强的 for 循环来遍历列表。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | import java.util.List; import java.util.ArrayList; import java.util.Arrays; class Main { // 遍历列表的 Java 程序 public static void main(String[] args) { List<String> list = Arrays.asList("C", "C++", "Java"); // 1. 使用for循环打印列表 for (int i = 0; i < list.size(); i++) { System.out.println(list.get(i)); } // 2. 使用增强的for循环打印列表 for (String s: list) { System.out.println(s); } } } |
4. Java 8——使用流和 Lambda
在 Java 8 中,我们可以借助流、lambda 和 forEach 来循环列表。以下程序显示了 4 种方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | import java.util.Arrays; import java.util.List; import java.util.stream.Stream; class Main { // 遍历列表的 Java 程序 public static void main(String[] args) { List<String> list = Arrays.asList("C", "C++", "Java"); // 1. 获取流并使用 lambda 表达式 list.stream().forEach(S -> { System.out.println(S); }); // 上面代码的简写 list.stream().forEach(S -> System.out.println(S)); // 2. 通过提供方法引用 list.stream().forEach(System.out::println); // 3. List 从 `Iterable` 接口继承 `forEach()` list.forEach(System.out::println); // 4. 使用`Stream.of()`获取`Stream ` Stream.of(list.toArray()) .forEach(System.out::println); } } |
5. 将列表转换为数组
我们还可以使用将列表转换为数组 List.toArray(T[ ]) 方法,然后使用 for 循环遍历数组或使用打印它 Arrays.toString()
.还有其他几种实现 toArray()
方法,如下图:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | import com.google.common.collect.FluentIterable; import com.google.common.collect.Iterables; import java.util.Arrays; import java.util.List; class Main { // 遍历列表的 Java 程序 public static void main(String[] args) { List<String> list = Arrays.asList("C", "C++", "Java"); // 将列表转换为数组 String[] array = null; // 1. 使用 `List.toArray(T[])` 方法 array = list.toArray(new String[list.size()]); System.out.println(Arrays.toString(array)); // 2. `List.toArray(T[])` – 不分配任何内存 array = list.toArray(new String[0]); System.out.println(Arrays.toString(array)); // 3. 使用 `List.toArray()` 方法 System.out.println(Arrays.toString(list.toArray())); // 4. Java 8 – 流 + 方法引用 array = list.stream().toArray(String[]::new); System.out.println(Arrays.toString(array)); // 5. Java 8 – Streams + lambda 表达式 array = list.stream().toArray(n -> new String[n]); System.out.println(Arrays.toString(array)); // 6. 使用 Guava 库中的 `FluentIterable` 类 array = FluentIterable.from(list).toArray(String.class); System.out.println(Arrays.toString(array)); // 7. 使用 Guava 库中的 `Iterables` 类 array = Iterables.toArray(list, String.class); System.out.println(Arrays.toString(array)); } } |
6.使用 Enumeration
界面
最后,我们可以使用已弃用的 枚举 打印列表的界面。该接口提供了枚举向量元素的方法。因此,我们需要先将列表转换为 Vector,然后打印所有 Vector 元素。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | import java.util.*; class Main { // 遍历列表的 Java 程序 public static void main(String[] args) { List<String> list = Arrays.asList("C", "C++", "Java"); // 1. 将 `List` 转换为 `Vector` @Deprecated Enumeration<String> enumeration = new Vector(list).elements(); // 如果枚举包含更多元素 while (enumeration.hasMoreElements()) { // 打印枚举的下一个元素 System.out.println(enumeration.nextElement()); } // 2. `Collections.enumeration()` 返回一个枚举 // 指定集合 enumeration = Collections.enumeration(list); while (enumeration.hasMoreElements()) { System.out.println(enumeration.nextElement()); } } } |
这就是在 Java 中迭代 List 的全部内容