【问题标题】:How do I clone a java byte array?如何克隆 java 字节数组?
【发布时间】:2011-03-13 15:23:13
【问题描述】:

我有一个字节数组,我想复制/克隆它以避免调用代码修改我的内部表示。

如何克隆 java 字节数组?

【问题讨论】:

  • 根据您在 byte[] 中存储的数据类型,不需要复制的不可变列表可能会“更好”。

标签: java


【解决方案1】:

这很容易,而且这样做是个好主意。

byte[] copy = arr.clone();

注意数组的clone()方法的返回类型是数组的类型,所以不需要强制转换。

【讨论】:

    【解决方案2】:

    System.arraycopy(src, 0, dst, 0, src.length);

    【讨论】:

    • 实际上并没有回答问题。
    • 我看不出它是如何回答问题的。您将适当的参数传递给它,然后您将获得数组的副本(克隆)。我错过了什么?
    • @TofuBeer 你没说需要先创建一个和源一样大小的数组。
    【解决方案3】:

    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
    • 我只是喜欢 arraycopy 因为我一般不喜欢克隆 - 被设计破坏:-)
    • @TofuBeer:是的,clone 通常确实被破坏了,但 Bloch 声称 Doug Lea 对数组例外 (artima.com/intv/bloch13.html)
    【解决方案4】:

    为了避免可能的空指针异常,我使用以下语法:

    byte[] copy = (arr == null) ? null : arr.clone();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-18
      • 1970-01-01
      • 1970-01-01
      • 2018-02-11
      • 2012-02-24
      • 1970-01-01
      • 1970-01-01
      • 2013-02-19
      相关资源
      最近更新 更多