Java中ArrayList.get()打印内存地址而非值,二维ArrayList无法输出格式化数字网格
解决二维ArrayList打印内存地址&批量添加元素的问题
嘿,我刚看完你的问题,这确实是新手用二维ArrayList常踩的坑,我来一步步帮你捋清楚!
为什么会打印内存地址?
当你直接调用System.out.println(arrayList.get(i))时,其实你打印的是整个内层ArrayList对象,Java默认会输出它的toString()结果,也就是类似java.util.ArrayList@xxxxxx的内存地址标识,而不是里面的具体元素。
批量添加元素的正确姿势
你完全不用逐个调用.add(),ArrayList有addAll()方法可以批量添加元素,但要注意把数组转成Collection类型(比如用Arrays.asList()),举个实用的例子:
// 初始化二维ArrayList ArrayList<ArrayList<Integer>> grid = new ArrayList<>(); // 处理基本类型int数组的情况 int[] rowArray = {1, 2, 3, 4}; // 先把int[]转成Integer[],再包装成ArrayList ArrayList<Integer> rowList = new ArrayList<>(Arrays.asList(Arrays.stream(rowArray).boxed().toArray(Integer[]::new))); grid.add(rowList); // 如果是包装类型Integer[],会更简单 Integer[] rowIntegerArray = {5, 6, 7, 8}; grid.add(new ArrayList<>(Arrays.asList(rowIntegerArray)));
这里要注意:Arrays.asList()返回的是固定大小的List,没法直接修改,所以最好把它包装成新的ArrayList。如果是基本类型数组(比如int[]),必须先转成包装类型数组(Integer[])才能用Arrays.asList(),上面用Stream做转换是比较简洁的方式。
正确打印数字网格的方法
你需要嵌套遍历二维ArrayList:先遍历外层的每一行(每个内层ArrayList),再遍历该行的每个元素:
// 遍历打印二维ArrayList for (ArrayList<Integer> row : grid) { for (Integer num : row) { System.out.print(num + "\t"); // 用制表符对齐更美观 } System.out.println(); // 每行结束换行 }
这样就能像二维数组一样打印出格式化的数字网格,而不是内存地址了。
完整可运行示例
给你一个完整的代码示例,方便你直接参考:
import java.util.ArrayList; import java.util.Arrays; import java.util.stream.Stream; public class GridDemo { public static void main(String[] args) { // 初始化二维ArrayList ArrayList<ArrayList<Integer>> grid = new ArrayList<>(); // 批量添加第一行 int[] row1 = {1, 2, 3}; ArrayList<Integer> rowList1 = new ArrayList<>(Arrays.asList(Stream.of(row1).boxed().toArray(Integer[]::new))); grid.add(rowList1); // 批量添加第二行 Integer[] row2 = {4, 5, 6}; grid.add(new ArrayList<>(Arrays.asList(row2))); // 打印格式化网格 System.out.println("格式化的数字网格:"); for (ArrayList<Integer> row : grid) { for (Integer num : row) { System.out.print(num + "\t"); } System.out.println(); } } }
内容的提问来源于stack exchange,提问作者Haytham
相关产品推荐
相关产品推荐

