Java:System.arraycopy 没有复制我的数组

Posted

技术标签:

【中文标题】Java:System.arraycopy 没有复制我的数组【英文标题】:Java: System.arraycopy is not copying my arrays 【发布时间】:2013-05-08 15:34:26 【问题描述】:

我有一个名为“first”的数组和另一个名为“second”的数组,这两个数组都是字节类型,大小为 10 个索引。

我将这两个数组复制到一个名为“第三”的数组中,该数组也是字节类型,长度为 2*first.length,如下所示:

byte[] third= new byte[2*first.length];
for(int i = 0; i<first.length;i++)
    System.arraycopy(first[i], 0, third[i], 0, first.length);
       
for(int i = 0; i<second.length;i++)
    System.arraycopy(second[i], 0, third[i], first.length, first.length);
    

但它不是在复制,它会抛出异常:ArrayStoreException

我在here 上读到,当 src 数组中的元素由于类型不匹配而无法存储到 dest 数组中时,会引发此异常。但我所有的数组都以字节为单位,所以没有不匹配

到底是什么问题?

【问题讨论】:

如果您使用arraycopy,则不需要该循环。反过来,如果您使用循环,则不需要arraycopy,因为您是自己分配值。 【参考方案1】:

您传递System.arraycopy 数组,而不是数组元素。通过将first[i] 作为第一个参数传递给arraycopy,您将传入一个byte,它(因为arraycopy 被声明为接受Objectsrc 参数) 被提升为Byte。所以你得到ArrayStoreException是the documentation列表中的第一个原因:

...如果以下任何一项为真,则抛出 ArrayStoreException 并且不修改目标:

src 参数引用的对象不是数组。

以下是如何使用 arraycopy 将两个 byte[] 数组复制到第三个:

// Declarations for `first` and `second` for clarity
byte[] first = new byte[10];
byte[] second = new byte[10];
// ...presumably fill in `first` and `second` here...

// Copy to `third`
byte[] third = new byte[first.length + second.length];
System.arraycopy(first,  0, third, 0, first.length);
System.arraycopy(second, 0, third, first.length, second.length);

【讨论】:

谢谢大家..但我决定接受这个答案作为对我错误的解释..【参考方案2】:
System.arraycopy(first, 0, third, 0, first.length);
System.arraycopy(second, 0, third, first.length, second.length);

【讨论】:

以上是关于Java:System.arraycopy 没有复制我的数组的主要内容,如果未能解决你的问题,请参考以下文章

Java System.arraycopy

关于System.arrayCopy()方法

Java-Java中System.arraycopy() 和 Arrays.copyOf()两者之间的区别

java System.arraycopy()

Java中 System.arraycopy() 和 Arrays.copyOf()方法

Java方法之--System.arraycopy方法和Arrays.copyOf()