Java 实例 – 集合输出(建议收藏)

Java 实例 – 集合输出:从零开始掌握数据展示的艺术

在 Java 开发中,集合(Collection)是处理一组数据的核心工具。无论是从数据库读取用户列表,还是在内存中管理临时数据,我们几乎总要面对“如何把集合里的内容打印出来”这个问题。很多人刚接触 Java 时,面对 List、Set、Map 这些容器,只会用 System.out.println() 随便一输出,结果看到的是类似 java.util.ArrayList@123abc 这样的内存地址,完全不知道里面到底装了什么。

这背后反映的是一个关键问题:集合的“输出”不是简单的打印,而是一门需要掌握技巧的艺术。今天我们就来深入讲解 Java 实例 – 集合输出 的多种方式,从基础遍历到高级技巧,帮助你真正理解数据如何被“看见”。


为什么集合输出如此重要?

想象一下你正在开发一个订单管理系统。用户下单后,系统需要把订单详情展示给管理员。这些订单数据存储在 List<Order> 中。如果不能正确输出,管理员看到的可能是一堆乱码或内存地址,根本无法判断订单是否成功创建。

所以,集合输出不是“可有可无”的功能,而是数据可读性的第一道关卡。它决定了你的程序是否“能用”、是否“好用”。

在实际项目中,我们经常需要输出以下几种类型的数据:

  • 有序列表(如用户列表)
  • 去重集合(如标签集合)
  • 键值对(如配置项)

不同的集合类型,对应的输出方式也不同。接下来我们逐一拆解。


使用 for-each 循环遍历集合

最基础、最常用的方式是 for-each 循环。它语法简洁,可读性强,是初学者首选。

import java.util.ArrayList;
import java.util.List;

public class CollectionOutputExample {
    public static void main(String[] args) {
        // 创建一个包含用户姓名的列表
        List<String> users = new ArrayList<>();
        users.add("张三");
        users.add("李四");
        users.add("王五");
        users.add("赵六");

        // 使用 for-each 循环遍历并输出
        for (String user : users) {
            System.out.println("用户姓名:" + user);
        }
    }
}

代码注释

  • List<String> users:声明一个字符串类型的列表,用于存储用户姓名。
  • users.add():向列表中添加元素,顺序插入。
  • for (String user : users):增强型 for 循环,自动遍历集合中的每一个元素。
  • System.out.println():输出当前元素,同时加上提示文字,让输出更清晰。

这种写法适合所有实现了 Iterable 接口的集合,包括 ListSetQueue 等。


使用迭代器(Iterator)遍历集合

当需要在遍历过程中删除或修改元素时,推荐使用 Iterator。直接使用 for-each 会抛出 ConcurrentModificationException 异常。

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class IteratorExample {
    public static void main(String[] args) {
        List<String> fruits = new ArrayList<>();
        fruits.add("苹果");
        fruits.add("香蕉");
        fruits.add("橙子");
        fruits.add("葡萄");

        // 获取迭代器
        Iterator<String> iterator = fruits.iterator();

        // 使用 while 循环配合迭代器
        while (iterator.hasNext()) {
            String fruit = iterator.next();
            System.out.println("水果:" + fruit);

            // 如果是“香蕉”,就从集合中移除
            if ("香蕉".equals(fruit)) {
                iterator.remove(); // 安全删除
            }
        }

        // 输出剩余元素
        System.out.println("删除香蕉后剩余水果:" + fruits);
    }
}

代码注释

  • iterator.hasNext():判断是否还有下一个元素。
  • iterator.next():获取下一个元素,并移动指针。
  • iterator.remove()唯一安全的删除方式,在遍历时调用,避免并发修改异常。

小贴士:迭代器就像一个“导游”,带你逐个参观集合中的“景点”(元素),并且允许你在参观途中“拆除”某些景点,而不会让整个队伍崩溃。


遍历 Map 集合:键值对的输出技巧

Map 是键值对的集合,常见于配置项、缓存、用户信息映射等场景。输出时需同时获取 key 和 value。

import java.util.HashMap;
import java.util.Map;

public class MapOutputExample {
    public static void main(String[] args) {
        // 创建一个学生成绩表
        Map<String, Integer> scores = new HashMap<>();
        scores.put("张三", 95);
        scores.put("李四", 87);
        scores.put("王五", 92);
        scores.put("赵六", 78);

        // 方法一:遍历 entrySet
        for (Map.Entry<String, Integer> entry : scores.entrySet()) {
            String name = entry.getKey();
            Integer score = entry.getValue();
            System.out.println(name + " 的成绩是:" + score);
        }

        // 方法二:遍历 keySet
        System.out.println("\n=== 使用 keySet 输出 ===");
        for (String name : scores.keySet()) {
            Integer score = scores.get(name);
            System.out.println(name + " 的成绩是:" + score);
        }
    }
}

代码注释

  • entrySet():返回所有键值对的集合,适合同时操作 key 和 value。
  • getKey()getValue():分别获取键和值。
  • keySet():只获取所有键,适合只需要键的场景。
  • get(key):通过键获取对应的值。

对比建议:优先使用 entrySet(),性能更好,代码更清晰。


使用 Java 8 Stream API 进行函数式输出

Java 8 引入了 Stream API,让集合处理更加简洁优雅。它支持链式调用,适合复杂的数据处理。

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class StreamOutputExample {
    public static void main(String[] args) {
        List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");

        // 使用 Stream 输出所有名字,转为大写并添加前缀
        List<String> upperNames = names.stream()
                .map(name -> "尊敬的 " + name.toUpperCase())
                .collect(Collectors.toList());

        // 输出结果
        upperNames.forEach(System.out::println);
    }
}

代码注释

  • Arrays.asList():快速创建列表。
  • stream():将集合转为 Stream 流。
  • map():对每个元素进行转换(这里是转大写并加前缀)。
  • collect(Collectors.toList()):将处理后的元素收集回 List。
  • forEach(System.out::println):逐个输出,语法更简洁。

优势:代码更短、逻辑更清晰,适合数据清洗、筛选、转换等操作。


输出格式优化:使用 StringBuilder 提升性能

当集合元素很多时,频繁调用 System.out.println() 会严重影响性能。推荐使用 StringBuilder 拼接后再一次性输出。

import java.util.ArrayList;
import java.util.List;

public class StringBuilderOutputExample {
    public static void main(String[] args) {
        List<Integer> numbers = new ArrayList<>();
        for (int i = 1; i <= 100; i++) {
            numbers.add(i);
        }

        // 使用 StringBuilder 拼接输出
        StringBuilder sb = new StringBuilder();
        sb.append("数字列表:");

        for (int num : numbers) {
            sb.append(num).append(", ");
        }

        // 移除最后一个多余的逗号和空格
        if (sb.length() > 0) {
            sb.setLength(sb.length() - 2);
        }

        System.out.println(sb.toString());
    }
}

代码注释

  • StringBuilder:可变字符串,适合频繁拼接。
  • append():追加内容,支持链式调用。
  • setLength():截断字符串,去掉最后的“, ”。
  • 一次性输出,避免多次 I/O 操作,性能提升显著。

适用场景:日志输出、大数据量集合展示、报表生成。


实际应用案例:用户信息导出为表格格式

下面是一个完整的 Java 实例 – 集合输出 应用场景:将用户信息导出为表格形式,便于查看。

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.HashMap;

public class UserTableOutput {
    public static void main(String[] args) {
        // 模拟用户数据
        List<Map<String, String>> users = new ArrayList<>();

        Map<String, String> user1 = new HashMap<>();
        user1.put("姓名", "张三");
        user1.put("年龄", "28");
        user1.put("城市", "北京");

        Map<String, String> user2 = new HashMap<>();
        user2.put("姓名", "李四");
        user2.put("年龄", "32");
        user2.put("城市", "上海");

        users.add(user1);
        users.add(user2);

        // 打印表格头
        System.out.println("+--------+------+--------+");
        System.out.println("|  姓名  | 年龄 |  城市  |");
        System.out.println("+--------+------+--------+");

        // 输出每行数据
        for (Map<String, String> user : users) {
            System.out.printf("| %4s | %2s | %4s |\n",
                    user.get("姓名"),
                    user.get("年龄"),
                    user.get("城市"));
        }

        System.out.println("+--------+------+--------+");
    }
}

输出效果

+--------+------+--------+
|  姓名  | 年龄 |  城市  |
+--------+------+--------+
|  张三  | 28 |  北京  |
|  李四  | 32 |  上海  |
+--------+------+--------+

代码注释

  • printf:格式化输出,%4s 表示占 4 个字符宽度,左对齐。
  • | 作为分隔符,模拟表格边框。
  • 适合用于控制台日志、报表预览等场景。

总结:掌握集合输出,让数据“活”起来

通过今天的分享,我们系统学习了 Java 实例 – 集合输出 的多种方式:

  • 基础的 for-each 循环适合简单遍历;
  • 迭代器在需要修改集合时必不可少;
  • Map 的输出需关注 key 和 value 的获取方式;
  • Stream API 让代码更简洁,适合函数式编程;
  • StringBuilder 提升大数据输出性能;
  • 格式化输出(如表格)让数据更直观。

记住,集合输出不仅仅是“打印”,更是数据沟通的第一步。写得清楚,才能用得明白。希望你能在项目中灵活运用这些技巧,让自己的 Java 代码不仅“能跑”,更“好看”、“好用”。

小建议:在调试时,不妨先用 System.out.println() 输出集合内容,确认数据无误后再做进一步处理。这是最简单却最有效的排查手段。

祝你编程愉快!