一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

Arrays.deepToString用于处理深度嵌套的集合数组

时间:2026-06-24 08:44:03 编辑:袖梨 来源:一聚教程网

Arrays.deepToString()仅递归处理原生数组,对List等集合只调用其toString();遇List<int[]>时无法展开内部数组,需手动映射或转二维数组,JSON工具更适配复杂嵌套结构。

Arrays.deepToString() 本身不处理集合(如 ListSetMap,它只识别并递归展开 Java 原生数组类型(包括 int[]String[]Object[] 及其任意嵌套组合)。如果数组元素是 List 或其他集合对象,deepToString() 会直接调用该集合的 toString() 方法——而标准集合类(如 ArrayList)已重写 toString(),所以能显示内容;但若集合里又嵌套了数组,那这部分数组不会被 deepToString() 自动展开


它能处理哪些“嵌套集合数组”?

  • Object[] 中混装 List<String>int[]

    Object[] mixed = {    Arrays.asList("a", "b"),    new int[]{1, 2, 3},    new String[]{"x", "y"}};System.out.println(Arrays.deepToString(mixed));// 输出:[[a, b], [1, 2, 3], [x, y]]

    List 显示为 [a, b](靠 ArrayList.toString()),int[]String[] 则由 deepToString 展开。

  • Object[] 中放 List<int[]>List<List<String>>

    List<int[]> list = Arrays.asList(new int[]{1}, new int[]{2, 3});System.out.println(Arrays.deepToString(new Object[]{list}));// 输出:[[I@..., [I@...] —— 因为 list.toString() 只打印内部 int[] 的哈希值,deepToString 不介入

关键点:deepToString 的“深度”仅限于数组类型层级,它不做反射、不遍历集合字段、不解析泛型结构。


遇到集合嵌套数组时怎么办?

  • 手动展开集合中的数组:在 toString() 里显式调用 Arrays.deepToString

    class Data {    List<int[]> rows;    Data(List<int[]> rows) { this.rows = rows; }    @Override    public String toString() {        return "Data{" +               "rows=" + rows.stream()                             .map(Arrays::deepToString)                             .collect(Collectors.joining(", ", "[", "]")) +               '}';    }}
  • 统一转成数组再处理(适合临时调试):

    List<int[]> list = Arrays.asList(new int[]{1,2}, new int[]{3,4,5});int[][] arr = list.toArray(int[0][]); // 转为二维数组System.out.println(Arrays.deepToString(arr)); // [[1, 2], [3, 4, 5]]
  • 用 JSON 工具替代(推荐用于含集合的复杂结构):

    Gson gson = new GsonBuilder().setPrettyPrinting().create();System.out.println(gson.toJson(mixed)); // 自动序列化 List、数组、嵌套结构

注意空值与类型边界

  • null 元素会被打印为 "null"(安全)
  • Object[] 中若含未重写 toString() 的自定义对象,仍显示 ClassName@hash
  • deepToStringbyte[]boolean[] 等基本类型数组同样有效,无需额外适配

不复杂但容易忽略

热门栏目