Nếu bạn phải làm việc với mảng liệu và không ArrayList
sau đó Arrays
có những gì bạn cần. Nếu bạn nhìn vào mã nguồn, đây là những cách hoàn toàn tốt nhất để có được một bản sao của một mảng. Họ có một chút lập trình phòng thủ tốt bởi vì System.arraycopy()
phương thức này ném ra rất nhiều ngoại lệ không được kiểm soát nếu bạn cung cấp cho nó các tham số phi logic.
Bạn có thể sử dụng một trong hai Arrays.copyOf()
sẽ sao chép từ Nth
phần tử đầu tiên sang phần tử ngắn hơn.
public static <T> T[] copyOf(T[] original, int newLength)
Sao chép mảng đã chỉ định, cắt bớt hoặc đệm bằng null (nếu cần) để bản sao có độ dài được chỉ định. Đối với tất cả các chỉ mục hợp lệ trong cả mảng gốc và bản sao, hai mảng sẽ chứa các giá trị giống hệt nhau. Đối với bất kỳ chỉ số nào hợp lệ trong bản sao nhưng không phải bản gốc, bản sao sẽ chứa null. Các chỉ số như vậy sẽ tồn tại khi và chỉ khi độ dài được chỉ định lớn hơn độ dài của mảng ban đầu. Mảng kết quả là chính xác cùng lớp với mảng ban đầu.
2770
2771 public static <T,U> T[] More ...copyOf(U[] original, int newLength, Class<? extends T[]> newType) {
2772 T[] copy = ((Object)newType == (Object)Object[].class)
2773 ? (T[]) new Object[newLength]
2774 : (T[]) Array.newInstance(newType.getComponentType(), newLength);
2775 System.arraycopy(original, 0, copy, 0,
2776 Math.min(original.length, newLength));
2777 return copy;
2778 }
hoặc Arrays.copyOfRange()
cũng sẽ thực hiện các mẹo:
public static <T> T[] copyOfRange(T[] original, int from, int to)
Sao chép phạm vi chỉ định của mảng đã chỉ định thành một mảng mới. Chỉ số ban đầu của phạm vi (từ) phải nằm giữa 0 và gốc.length, đã bao gồm. Giá trị tại bản gốc [từ] được đặt vào phần tử ban đầu của bản sao (trừ khi từ == original.length hoặc từ == đến). Các giá trị từ các phần tử tiếp theo trong mảng ban đầu được đặt vào các phần tử tiếp theo trong bản sao. Chỉ mục cuối cùng của phạm vi (đến), phải lớn hơn hoặc bằng từ, có thể lớn hơn gốc.length, trong trường hợp null được đặt trong tất cả các thành phần của bản sao có chỉ số lớn hơn hoặc bằng gốc. chiều dài - từ. Độ dài của mảng trả về sẽ là - từ. Mảng kết quả là chính xác cùng lớp với mảng ban đầu.
3035 public static <T,U> T[] More ...copyOfRange(U[] original, int from, int to, Class<? extends T[]> newType) {
3036 int newLength = to - from;
3037 if (newLength < 0)
3038 throw new IllegalArgumentException(from + " > " + to);
3039 T[] copy = ((Object)newType == (Object)Object[].class)
3040 ? (T[]) new Object[newLength]
3041 : (T[]) Array.newInstance(newType.getComponentType(), newLength);
3042 System.arraycopy(original, from, copy, 0,
3043 Math.min(original.length - from, newLength));
3044 return copy;
3045 }
Như bạn có thể thấy, cả hai đều chỉ là các hàm bao bọc System.arraycopy
với logic phòng thủ mà những gì bạn đang cố gắng làm là hợp lệ.
System.arraycopy
là cách nhanh nhất tuyệt đối để sao chép mảng.