Java11如何将数组内容副本作为元素存入List无需显式遍历
问题说明
你写的数组拷贝逻辑本身没有问题,x.clone() 和 Arrays.copyOf(x, x.length) 都已经生成了独立的数组副本存入List,并没有存储原数组x的引用。你看到[[I@6442b0a6]这类输出,和拷贝逻辑无关,本质是Java数组的默认字符串输出规则导致的:
- Java数组没有重写
Object类的toString()方法,直接打印数组对象时会调用Object的默认实现,输出格式为[数组类型标识@对象哈希值。输出里的[I代表这是int类型一维数组,后面的十六进制字符串是对象的哈希值,不会展示数组实际存储的内容。 - 直接调用
System.out.println(testList)时,ArrayList的toString()方法会逐个调用内部存储元素的toString()方法拼接结果,所以最终只会打印出数组对象的默认字符串,看不到实际存的数值。
拷贝有效性验证
你可以通过修改原数组取值的方式,确认存入List的是独立副本:
int x[] = new int[]{3,4}; List<int[]> testList = new ArrayList<>(); testList.add(x.clone()); // 修改原数组的元素值 x[0] = 99; // 取出List中存储的数组查看值 int[] storedArr = testList.get(0); System.out.println(storedArr[0]); // 输出结果为3,不是修改后的99,证明存储的是独立副本,和原数组互不影响
实现需求的两种方案
根据你要的存储效果,选对应实现即可,都不需要手动遍历数组:
- 保持
List<int[]>的存储结构,正常打印内容
直接用Arrays.deepToString()处理集合即可,它会自动递归遍历数组元素拼接实际内容:System.out.println(Arrays.deepToString(testList.toArray())); // 输出结果:[[3, 4]] - 直接存储整数元素而非int数组对象
如果不需要把数组作为整体存入,而是要把数组里的数值存成List的元素,可以用流转换直接得到List<Integer>:
如果需要可变的ArrayList,把流的结果传入ArrayList构造方法即可:int x[] = new int[]{3,4}; // 转换为存储整数的List List<Integer> testList = Arrays.stream(x).boxed().toList(); System.out.println(testList); // 直接输出:[3, 4]new ArrayList<>(Arrays.stream(x).boxed().toList())
内容的提问来源于stack exchange,提问作者Evgeny Kuznetsov
相关产品推荐
相关产品推荐

