You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,证明存储的是独立副本,和原数组互不影响
实现需求的两种方案

根据你要的存储效果,选对应实现即可,都不需要手动遍历数组:

  1. 保持List<int[]>的存储结构,正常打印内容
    直接用Arrays.deepToString()处理集合即可,它会自动递归遍历数组元素拼接实际内容:
    System.out.println(Arrays.deepToString(testList.toArray()));
    // 输出结果:[[3, 4]]
    
  2. 直接存储整数元素而非int数组对象
    如果不需要把数组作为整体存入,而是要把数组里的数值存成List的元素,可以用流转换直接得到List<Integer>:
    int x[] = new int[]{3,4};
    // 转换为存储整数的List
    List<Integer> testList = Arrays.stream(x).boxed().toList();
    System.out.println(testList);
    // 直接输出:[3, 4]
    
    如果需要可变的ArrayList,把流的结果传入ArrayList构造方法即可:new ArrayList<>(Arrays.stream(x).boxed().toList())

内容的提问来源于stack exchange,提问作者Evgeny Kuznetsov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 13:18:16