【发布时间】:2011-03-13 15:23:13
【问题描述】:
我有一个字节数组,我想复制/克隆它以避免调用代码修改我的内部表示。
如何克隆 java 字节数组?
【问题讨论】:
-
根据您在
byte[]中存储的数据类型,不需要复制的不可变列表可能会“更好”。
标签: java
我有一个字节数组,我想复制/克隆它以避免调用代码修改我的内部表示。
如何克隆 java 字节数组?
【问题讨论】:
byte[] 中存储的数据类型,不需要复制的不可变列表可能会“更好”。
标签: java
这很容易,而且这样做是个好主意。
byte[] copy = arr.clone();
注意数组的clone()方法的返回类型是数组的类型,所以不需要强制转换。
【讨论】:
System.arraycopy(src, 0, dst, 0, src.length);
【讨论】:
JLS 6.4.5 The Members of an Array Type
数组类型的成员都有以下几种:
public final field length,包含数组的组件数(长度可以是正数或零)。public方法clone,它覆盖了类Object中的同名方法,并且不抛出任何检查异常。数组类型T[]的克隆方法的返回类型为T[]。- 继承自类
Object的所有成员;Object唯一未被继承的方法是它的clone方法。
因此:
byte[] original = ...;
byte[] copy = original.clone();
请注意,对于引用类型数组,clone() 本质上是一个shallow copy。
另外,Java 没有多维数组;它有数组数组。因此,byte[][] 是Object[],并且也受制于浅拷贝。
注意clone() 返回一个new 数组对象。如果您只是想将一个数组中的值复制到一个已经存在的数组中,您可以使用例如System.arraycopy.
还有java.util.Arrays.copyOf 允许您创建具有不同长度(截断或填充)的副本。
【讨论】:
.clone 不适用于数组;我会说arraycopylike TofuBeer
clone 通常确实被破坏了,但 Bloch 声称 Doug Lea 对数组例外 (artima.com/intv/bloch13.html)
为了避免可能的空指针异常,我使用以下语法:
byte[] copy = (arr == null) ? null : arr.clone();
【讨论】: