创建一个示例 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("苹果", "香蕉", "橙子", "葡萄"));
// 创建一个存储 Integer 类型数据的 ArrayList
ArrayList<Integer> numbers = new ArrayList<>(Arrays.asList(10, 20, 30, 40, 50));
// 创建一个存储自定义对象 User 的 ArrayList (见下文)
ArrayList<User> users = new ArrayList<>();
users.add(new User("张三", 25));
users.add(new User("李四", 30));
}
}
// 自定义 User 类
class User {
private String name;
private int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
// 为了方便输出,重写 toString() 方法
@Override
public String toString() {
return "User{name='" + name + "', age=" + age + "}";
}
}
使用传统的 for 循环 (经典方法)
这是最基础、最通用的方法,适用于所有版本的 Java,你可以通过索引逐个访问并打印 ArrayList 中的元素。
优点:
- 灵活性高,可以在循环内部获取索引,方便进行更复杂的操作。
- 兼容性最好,适用于所有 Java 版本。
缺点:
- 代码相对冗长。
示例代码:

System.out.println("--- 方法一:传统 for 循环 ---");
// 输出 String 类型的 ArrayList
for (int i = 0; i < fruits.size(); i++) {
System.out.println(fruits.get(i));
}
// 输出 Integer 类型的 ArrayList
for (int i = 0; i < numbers.size(); i++) {
System.out.println(numbers.get(i));
}
输出:
--- 方法一:传统 for 循环 ---
苹果
香蕉
橙子
葡萄
10
20
30
40
50
使用增强 for 循环 (For-Each 循环)
这是目前最常用、最简洁的遍历 Collection(包括 ArrayList)的方法,它语法简单,可读性强。
优点:
- 代码简洁,易于阅读。
- 适用于只需要元素值,不需要索引的场景。
缺点:

- 无法直接获取元素的索引。
示例代码:
System.out.println("\n--- 方法二:增强 for 循环 (For-Each) ---");
// 输出 String 类型的 ArrayList
for (String fruit : fruits) {
System.out.println(fruit);
}
// 输出 Integer 类型的 ArrayList
for (Integer number : numbers) {
System.out.println(number);
}
输出:
--- 方法二:增强 for 循环 (For-Each) ---
苹果
香蕉
橙子
葡萄
10
20
30
40
50
使用 Java 8+ 的 Stream API (函数式编程风格)
如果你使用的是 Java 8 或更高版本,Stream API 提供了一种非常强大和灵活的方式来处理集合,包括输出。
优点:
- 链式调用,代码风格现代、函数式。
- 可以轻松地进行过滤、排序、转换等操作后再输出。
缺点:
- 对于简单的输出,可能显得有些“重”。
示例代码:
System.out.println("\n--- 方法三:Java 8+ Stream API ---");
// 输出 String 类型的 ArrayList
// forEach 是一个终端操作,对流中的每个元素执行操作
fruits.stream().forEach(System.out::println);
// 输出 Integer 类型的 ArrayList
numbers.stream().forEach(System.out::println);
// Stream API 的高级示例:只输出偶数
System.out.println("\n--- Stream API 高级示例:只输出偶数 ---");
numbers.stream()
.filter(n -> n % 2 == 0) // 过滤出偶数
.forEach(System.out::println);
输出:
--- 方法三:Java 8+ Stream API ---
苹果
香蕉
橙子
葡萄
10
20
30
40
50
--- Stream API 高级示例:只输出偶数 ---
10
20
30
40
50
System.out::println 是一个方法引用,等同于 element -> System.out.println(element),是 Java 8 的一个语法糖。
使用 toString() 方法 (快速调试)
ArrayList 及其所有父类都重写了 toString() 方法,它会以 [elem1, elem2, elem3] 的格式返回 ArrayList 的字符串表示。
优点:
- 极其方便,一行代码即可完成。
- 非常适合在调试(
System.out.println())或日志记录时快速查看ArrayList的内容。
缺点:
- 输出格式是固定的,无法自定义。
ArrayList中存储的是自定义对象,并且你没有重写该对象的toString()方法,输出结果将是对象的内存地址(如com.example.User@1b6d3586),这通常不是我们想要的。
示例代码:
System.out.println("\n--- 方法四:使用 toString() 方法 ---");
// 输出 String 类型的 ArrayList
System.out.println(fruits); // ArrayList<String> 的 toString() 会调用每个元素的 toString()
// 输出 Integer 类型的 ArrayList
System.out.println(numbers);
// 输出自定义对象 User 的 ArrayList
// 注意:因为我们已经在 User 类中重写了 toString(),所以输出是友好的
System.out.println(users);
输出:
--- 方法四:使用 toString() 方法 ---
[苹果, 香蕉, 橙子, 葡萄]
[10, 20, 30, 40, 50]
[User{name='张三', age=25}, User{name='李四', age=30}]
使用 Arrays.toString() (不推荐,但需了解)
注意: 这个方法不适用于 ArrayList。Arrays.toString() 是用来打印数组的,如果你把它用在 ArrayList 上,它会输出 ArrayList 对象本身的地址信息,而不是其内容。
错误示例:
// 错误用法!这不会输出 ArrayList 的内容 System.out.println(Arrays.toString(fruits));
错误输出:
[[Ljava.lang.String;@15db9742] // 这不是我们想要的结果
要使用 Arrays.toString() 的正确方式是先将 ArrayList 转换为数组。
// 正确用法:先将 ArrayList 转换为数组 System.out.println(Arrays.toString(fruits.toArray()));
正确输出:
[苹果, 香蕉, 橙子, 葡萄]
虽然可行,但不如直接使用 System.out.println(fruits) 来得简洁。
总结与推荐
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 传统 for 循环 | 灵活性高,可获取索引 | 代码冗长 | 需要在遍历时使用索引的场景 |
| 增强 for 循环 | 代码简洁,可读性强 | 无法获取索引 | 日常开发中最推荐,仅遍历元素值 |
| Stream API | 功能强大,链式操作,函数式风格 | 对简单任务可能过重 | Java 8+ 项目,需要结合过滤、排序等操作时 |
toString() |
最方便,一行代码搞定 | 格式固定,对自定义对象有要求 | 调试和日志记录,快速查看内容 |
Arrays.toString() |
(不适用) | (不适用) | 错误用法,请勿直接用于 ArrayList |
最终建议:
- 日常开发/快速调试: 优先使用
System.out.println(yourArrayList)。 - 遍历并处理每个元素: 优先使用增强 for 循环 (
for (T item : list)),它最直观、最常用。 - 需要复杂操作(如过滤后输出): 使用 Stream API。
- 需要索引: 使用传统 for 循环。
