代码之家  ›  专栏  ›  技术社区  ›  simon

在Java中是否有等价于MEMcPy()的?

  •  70
  • simon  · 技术社区  · 14 年前

    我有一个字节[],希望将其复制到另一个字节[]。也许我在这里展示了我的简单的C背景,但是Java中的字节数组有一个等价于MEMCYP()的吗?

    8 回复  |  直到 6 年前
        1
  •  81
  •   Tom    14 年前

    你可以试试 System.arraycopy 或者使用 Arrays 类类 java.util.Arrays.copyOf . 两者都应该给你带来本土的表演。

    Arrays.copyOf可能对可读性有利,但仅在Java 1.6中引入。

     byte[] src = {1, 2, 3, 4};
     byte[] dst = Arrays.copyOf(src, src.length);
     System.out.println(Arrays.toString(dst));
    
        2
  •  89
  •   Yuval Itzchakov    7 年前

    使用 System.arraycopy()

    System.arraycopy(sourceArray, 
                     sourceStartIndex,
                     targetArray,
                     targetStartIndex,
                     length);
    

    例子,

    String[] source = { "alpha", "beta", "gamma" };
    String[] target = new String[source.length];
    System.arraycopy(source, 0, target, 0, source.length);
    


    或使用 Arrays.copyOf()
    例子,

    target = Arrays.copyOf(source, length);
    

    java.util.Arrays.copyOf(byte[] source, int length) 在JDK 1.6中添加。

    这个 copyOf() 方法使用 System.arrayCopy() 复制数组,但比 clone() 因为可以复制数组的各个部分。

        3
  •  7
  •   Community c0D3l0g1c    7 年前

    如果只需要一维数组的精确副本,请使用 clone() .

    byte[] array = { 0x0A, 0x01 };
    byte[] copy = array.clone();
    

    对于其他数组复制操作,请使用 System.arrayCopy / Arrays.copyOf 作为 Tom suggests .

    一般来说, clone 应该避免,但这是规则的一个例外。

        4
  •  5
  •   mdma    14 年前

    你可以使用 System.arrayCopy . 它将元素从源数组复制到目标数组。Sun实现使用手工优化的汇编程序,所以这很快。

        5
  •  3
  •   Peter Schaeffer    11 年前

    Java实际上有一些类似于MycPy.()的东西。不安全类有一个与memcpy()基本相同的copymemory()方法。当然,和memcpy()一样,它不提供对内存覆盖、数据破坏等的保护。不清楚它是memcpy()还是memmove()。它可用于从实际地址复制到实际地址或从引用复制到引用。请注意,如果使用引用,则必须提供一个偏移量(否则JVM将尽快消失)。

    不安全的.copymemory()工作(在我的旧电脑上,每秒高达2 GB)。自担风险使用。请注意,并非所有JVM实现都存在不安全类。

        6
  •  2
  •   Artem Barger    14 年前

    你可以使用 System.arraycopy

        7
  •  1
  •   Molly Stewart-Gallus    6 年前

    不。 Java没有等效的 memcpy . Java有一个等价于 memmove 相反。

    如果src和dest参数引用同一个数组对象,则执行复制,就像位置srcpos到srcpos+length-1处的组件首先被复制到具有length组件的临时数组,然后通过目标数组的destpos+length-1将临时数组的内容复制到位置destpos。

    Oracle Docs

    很有可能 System.arraycopy 将永远不会有相同的性能 曼皮西 如果 src dest 引用同一数组。不过,这通常足够快。

        8
  •  0
  •   Molly Stewart-Gallus    6 年前

    使用 byteBufferViewVarHandle 或通过earrayviewvarhandle。

    这将允许您将“long”数组直接复制到“double”数组,类似于:

    public long[] toLongs(byte[] buf) {
        int end = buf.length >> 3;
        long[] newArray = new long[end];
        for (int ii = 0; ii < end; ++ii) {
            newArray[ii] = (long)AS_LONGS_VH.get(buf, ALIGN_OFFSET + ii << 3);
        }
    }
    
    private static final ALIGN_OFFSET = ByteBuffer.wrap(new byte[0]).alignmentOffset(8); 
    private static final VarHandle AS_LONGS_VH = MethodHandles.byteArrayViewVarHandle(long[].class, ByteOrder.nativeOrder());
    

    这可以让你进行黑客攻击,比如:

    float thefloat = 0.4;
    int floatBits;
    _Static_assert(sizeof theFloat == sizeof floatBits, "this bit twiddling hack requires floats to be equal in size to ints");
    memcpy(&floatBits, &thefloat, sizeof floatBits);