创建一个示例 ArrayList
我们创建一个 ArrayList 并填充一些数据,以便在下面的例子中使用。

import java.util.ArrayList;
import java.util.Arrays;
public class ArrayListOutputExample {
public static void main(String[] args) {
// 创建一个存储 String 类型的 ArrayList
ArrayList<String> fruits = new ArrayList<>(Arrays.asList("Apple", "Banana", "Cherry", "Date"));
// 创建一个存储 Integer 类型的 ArrayList
ArrayList<Integer> numbers = new ArrayList<>(Arrays.asList(10, 20, 30, 40, 50));
System.out.println("--- 准备工作完成,开始演示不同输出方法 ---");
}
}
使用传统的 for 循环(增强 for 循环 / for-each)
这是最基础、最直观的方法,适用于所有 Java 版本,并且非常高效。
特点:
- 代码清晰易懂。
- 只能用于遍历和读取元素,不能在遍历过程中修改
ArrayList的结构(如删除元素)。 - 推荐用于只读遍历。
代码示例:
// 输出 String 类型的 ArrayList
System.out.println("方法一:使用 for-each 循环输出水果列表");
for (String fruit : fruits) {
System.out.println(fruit);
}
// 输出 Integer 类型的 ArrayList
System.out.println("\n方法一:使用 for-each 循环输出数字列表");
for (Integer number : numbers) {
System.out.println(number);
}
输出结果:

使用 for-each 循环输出水果列表
Apple
Banana
Cherry
Date
方法一:使用 for-each 循环输出数字列表
10
20
30
40
50
使用传统的 for 循环(带索引)
如果你需要在遍历时获取元素的索引,或者需要根据索引修改元素,这种方法更合适。
特点:
- 可以通过索引
i访问元素。 - 可以安全地删除元素(使用
list.remove(i))。 - 代码比 for-each 循环稍显冗长。
代码示例:
System.out.println("\n方法二:使用带索引的 for 循环输出水果列表");
for (int i = 0; i < fruits.size(); i++) {
// 获取索引和对应的值
System.out.println("索引 [" + i + "]: " + fruits.get(i));
}
输出结果:

使用带索引的 for 循环输出水果列表
索引 [0]: Apple
索引 [1]: Banana
索引 [2]: Cherry
索引 [3]: Date
使用 Java 8+ 的 Stream API (推荐)
这是现代 Java 中最灵活、最强大的方式,它不仅用于打印,还可以进行各种复杂的转换和聚合操作。
特点:
- 代码简洁,函数式风格。
- 可以链式调用其他 Stream 操作(如
map,filter,sorted)。 - 需要Java 8或更高版本。
代码示例:
System.out.println("\n方法三:使用 Java 8 Stream API 输出水果列表");
// 1. 最简单的打印方式
fruits.stream().forEach(System.out::println);
// 2. 更具表现力的方式,可以自定义格式
System.out.println("\n使用 Stream API 并添加格式:");
numbers.stream().forEach(number -> System.out.println("数字是: " + number));
fruits.stream():将ArrayList转换为一个 Stream(流)。forEach(System.out::println):对流中的每一个元素执行System.out.println操作。System.out::println是一个方法引用,等同于element -> System.out.println(element)。
输出结果:
使用 Java 8 Stream API 输出水果列表
Apple
Banana
Cherry
Date
使用 Stream API 并添加格式:
数字是: 10
数字是: 20
数字是: 30
数字是: 40
数字是: 50
使用 toString() 方法(调试用)
ArrayList (以及其父类 AbstractList) 重写了 toString() 方法,它会以 [elem1, elem2, elem3] 的格式返回列表的字符串表示形式。
特点:
- 非常方便,一行代码即可。
- 主要用于调试和日志记录,不适合用于最终的用户界面展示,因为它会把所有元素放在一行。
代码示例:
System.out.println("\n方法四:使用 toString() 方法");
System.out.println("水果列表的字符串形式: " + fruits);
System.out.println("数字列表的字符串形式: " + numbers);
输出结果:
使用 toString() 方法
水果列表的字符串形式: [Apple, Banana, Cherry, Date]
数字列表的字符串形式: [10, 20, 30, 40, 50]
使用 Arrays.toString() (错误的方式)
这是一个初学者常犯的错误。Arrays.toString() 是用来打印数组的,不是 ArrayList,虽然可以编译,但结果不是你想要的。
错误代码示例:
// 错误示范!不要这样做!
System.out.println("\n方法五:错误示范 - 使用 Arrays.toString()");
// System.out.println(Arrays.toString(fruits)); // 这行代码会编译失败!
// 正确的用法是先将 ArrayList 转换为数组
System.out.println("错误的方式(先转数组再打印): " + Arrays.toString(fruits.toArray()));
fruits.toArray():将ArrayList转换为一个 Object 数组。- 然后对这个数组调用
Arrays.toString()。
输出结果:
错误示范 - 使用 Arrays.toString()
错误的方式(先转数组再打印): [Apple, Banana, Cherry, Date]
你会发现,这个输出和方法四的 toString() 结果一模一样,这说明 ArrayList 的 toString() 内部很可能就是先转成数组再调用的 Arrays.toString()。直接用 list.toString() 即可,无需多此一举。
总结与推荐
| 方法 | 优点 | 缺点 | 推荐场景 |
|---|---|---|---|
| for-each 循环 | 简单、高效、可读性高 | 无法获取索引,不能修改集合结构 | 日常遍历和打印的首选 |
| 带索引的 for 循环 | 可获取索引,可安全删除元素 | 代码稍显冗长 | 需要索引或修改集合元素时 |
| Java 8 Stream API | 功能强大、灵活、函数式风格 | 需要理解 Stream 概念,对新手有门槛 | 现代Java开发,需要复杂操作时 |
list.toString() |
一行代码搞定,方便调试 | 输出格式固定,不适合UI展示 | 调试和日志记录 |
最终建议:
- 如果只是简单地打印所有元素,使用 for-each 循环 是最稳妥、最经典的选择。
- 如果你在使用 Java 8 或更高版本,并且希望代码更现代化,使用 Stream API 是非常好的习惯。
- 如果你在调试代码,直接在
System.out.println()里传入ArrayList变量,它会自动调用toString()方法,非常方便。
