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

Java使用System.arraycopy为空数组追加元素后输出异常问题

问题原因

  • 直接打印数组对象得到[J@7dc5e7b4不是乱码,是Java数组的默认toString()逻辑:数组是Object子类,默认继承Object的toString方法,输出格式为[类型标识@内存哈希值,其中[J就是long类型数组的标识。
  • 调用Arrays.toString(field)输出空括号[]有三个触发原因:
    1. 你的代码全程没有调用过add()方法,静态数组field初始化就是空数组,没有任何元素。
    2. 你的add()方法逻辑有误:你把新添加的元素放在了新数组的下标0位置,相当于每次新增元素都插到数组头部而非追加到尾部,不符合你说的「追加参数」的需求。
    3. 如果你是先执行long[] result = field再调用add(),result会一直指向初始的空数组:数组是引用类型,赋值操作只是复制引用地址,后续field指向新数组不会同步更新result的指向。

解决方案

  1. 打印数组内容统一使用Arrays.toString(数组对象),不要直接打印数组本身。
  2. 新增元素前主动调用add()方法传入要添加的long值。
  3. 修改add()方法的赋值逻辑,把新元素放到新数组的最后一位实现追加效果。
  4. 如果需要保存最新的数组引用,要在调用完所有add()操作后再给变量赋值。

修正后的完整代码

import java.util.*;

public class Aufgabe_04_02 {
    static long[] field = new long[]{};
    
    static void add(long l) {
        long[] f1 = new long[field.length + 1];
        System.arraycopy(field, 0, f1, 0, field.length);
        // 新元素放到新数组最后一位,实现追加效果
        f1[field.length] = l;
        field = f1;
    }
    
    public static void main(String[] args) {
        // 先调用add添加元素
        add(10L);
        add(20L);
        add(30L);
        // 所有添加操作完成后再获取最新数组、打印内容
        long[] result = field;
        System.out.println(Arrays.toString(result));
    }
}

运行上述代码输出结果为:[10, 20, 30]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 11:45:04