Tôi có một byte [] và muốn sao chép nó vào một byte khác []. Có thể tôi đang hiển thị nền 'C' đơn giản của mình ở đây, nhưng có tương đương với memcpy () trên mảng byte trong Java không?
Câu trả lời:
Bạn có thể thử System.arraycopy
hoặc sử dụng các hàm mảng trong Arrays
lớp như java.util.Arrays.copyOf
. Cả hai đều sẽ mang lại cho bạn hiệu suất nguyên bản.
Arrays.copyOf có lẽ thuận lợi cho việc dễ đọc, nhưng chỉ được giới thiệu trong java 1.6.
byte[] src = {1, 2, 3, 4};
byte[] dst = Arrays.copyOf(src, src.length);
System.out.println(Arrays.toString(dst));
Sử dụng System.arraycopy ()
System.arraycopy(sourceArray,
sourceStartIndex,
targetArray,
targetStartIndex,
length);
Thí dụ,
String[] source = { "alpha", "beta", "gamma" };
String[] target = new String[source.length];
System.arraycopy(source, 0, target, 0, source.length);
hoặc sử dụng Ví dụ Arrays.copyOf ()
,
target = Arrays.copyOf(source, length);
java.util.Arrays.copyOf(byte[] source, int length)
đã được thêm vào JDK 1.6.
Các copyOf()
phương pháp sử dụng System.arrayCopy()
để tạo một bản sao của mảng, nhưng linh hoạt hơn clone()
vì bạn có thể tạo các bản sao của các bộ phận của một mảng.
Nếu bạn chỉ muốn có một bản sao chính xác của mảng một chiều, hãy sử dụng clone()
.
byte[] array = { 0x0A, 0x01 };
byte[] copy = array.clone();
Đối với các hoạt động sao chép mảng khác, hãy sử dụng System.arrayCopy
/ Arrays.copyOf
như Tom gợi ý .
Nói chung, clone
nên tránh, nhưng đây là một ngoại lệ đối với quy tắc.
Bạn có thể sử dụng System.arrayCopy . Nó sao chép các phần tử từ một mảng nguồn sang một mảng đích. Việc triển khai Sun sử dụng trình lắp ráp được tối ưu hóa bằng tay, vì vậy quá trình này diễn ra nhanh chóng.
Java thực sự có một cái gì đó giống như memcpy (). Lớp Không an toàn có phương thức copyMemory () về cơ bản giống với memcpy (). Tất nhiên, giống như memcpy (), nó không cung cấp sự bảo vệ khỏi lớp phủ bộ nhớ, phá hủy dữ liệu, v.v. Không rõ nó thực sự là memcpy () hay memmove (). Nó có thể được sử dụng để sao chép từ địa chỉ thực sang địa chỉ thực hoặc từ tài liệu tham khảo sang tài liệu tham khảo. Lưu ý rằng nếu các tham chiếu được sử dụng, bạn phải cung cấp một khoảng bù (nếu không JVM sẽ chết càng sớm càng tốt).
Unsafe.copyMemory () hoạt động (tối đa 2 GB mỗi giây trên máy tính cũ mệt mỏi của tôi). Sử dụng có nguy cơ của riêng bạn. Lưu ý rằng lớp Không an toàn không tồn tại cho tất cả các triển khai JVM.
sun.misc.Unsafe
lớp được coi là một hành vi xấu "hack" b / c đó là một lớp gói riêng . Ngoài ra, bắt đầu từ Java 9, nó sẽ không còn khả dụng nữa, vì vậy việc cố gắng sử dụng lớp này cũng giống như việc bạn cầu xin mã của bạn bị hỏng bất ngờ.
Bạn có thể sử dụng System.arraycopy
Sử dụng byteBufferViewVarHandle hoặc byteArrayViewVarHandle.
Điều này sẽ cho phép bạn sao chép trực tiếp một mảng "longs" vào một mảng "gấp đôi" và tương tự như sau:
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());
Điều này sẽ cho phép bạn thực hiện các thao tác hack như:
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);
Không. Java không có tương đương với memcpy
. Java có một tương đương với memmove
thay vào đó.
Nếu các đối số src và dest tham chiếu đến cùng một đối tượng mảng, thì việc sao chép được thực hiện như thể các thành phần tại các vị trí từ srcPos đến srcPos + length-1 lần đầu tiên được sao chép vào một mảng tạm thời với các thành phần độ dài và sau đó nội dung của mảng tạm thời là được sao chép vào các vị trí destPos thông qua destPos + length-1 của mảng đích.
Nó rất có thể System.arraycopy
sẽ không bao giờ có cùng hiệu suất như memcpy
thể src
và dest
tham chiếu đến cùng một mảng. Thông thường điều này sẽ đủ nhanh.