Java使用System.arraycopy为空数组追加元素后输出异常问题
问题原因
- 直接打印数组对象得到
[J@7dc5e7b4不是乱码,是Java数组的默认toString()逻辑:数组是Object子类,默认继承Object的toString方法,输出格式为[类型标识@内存哈希值,其中[J就是long类型数组的标识。 - 调用
Arrays.toString(field)输出空括号[]有三个触发原因:- 你的代码全程没有调用过
add()方法,静态数组field初始化就是空数组,没有任何元素。 - 你的
add()方法逻辑有误:你把新添加的元素放在了新数组的下标0位置,相当于每次新增元素都插到数组头部而非追加到尾部,不符合你说的「追加参数」的需求。 - 如果你是先执行
long[] result = field再调用add(),result会一直指向初始的空数组:数组是引用类型,赋值操作只是复制引用地址,后续field指向新数组不会同步更新result的指向。
- 你的代码全程没有调用过
解决方案
- 打印数组内容统一使用
Arrays.toString(数组对象),不要直接打印数组本身。 - 新增元素前主动调用
add()方法传入要添加的long值。 - 修改
add()方法的赋值逻辑,把新元素放到新数组的最后一位实现追加效果。 - 如果需要保存最新的数组引用,要在调用完所有
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
相关产品推荐
相关产品推荐

