Arrays.deepToString()仅递归处理原生数组,对List等集合只调用其toString();遇List<int[]>时无法展开内部数组,需手动映射或转二维数组,JSON工具更适配复杂嵌套结构。
Arrays.deepToString() 本身不处理集合(如 List、Set、Map),它只识别并递归展开 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 deepToString 对 byte[]、boolean[] 等基本类型数组同样有效,无需额外适配 不复杂但容易忽略