ถ้าคุณต้องทำงานกับอาร์เรย์ดิบและไม่ได้ArrayList
แล้วArrays
มีสิ่งที่คุณต้องการ หากคุณดูซอร์สโค้ดสิ่งเหล่านี้เป็นวิธีที่ดีที่สุดในการคัดลอกอาเรย์ พวกเขามีการเขียนโปรแกรมการป้องกันที่ดีเพราะSystem.arraycopy()
วิธีการนี้มีข้อยกเว้นมากมายที่ไม่ได้ตรวจสอบหากคุณป้อนพารามิเตอร์ที่ไม่มีเหตุผล
คุณสามารถใช้อย่างใดอย่างหนึ่งArrays.copyOf()
ซึ่งจะคัดลอกจากNth
องค์ประกอบแรกไปยังอาร์เรย์ที่สั้นกว่าใหม่
public static <T> T[] copyOf(T[] original, int newLength)
คัดลอกอาร์เรย์ที่ระบุการตัดปลายหรือขยายด้วย nulls (ถ้าจำเป็น) ดังนั้นการคัดลอกจึงมีความยาวที่ระบุ สำหรับดัชนีทั้งหมดที่ใช้ได้ทั้งในอาร์เรย์ดั้งเดิมและสำเนาทั้งสองอาร์เรย์จะมีค่าเหมือนกัน สำหรับดัชนีใด ๆ ที่ใช้ได้ในการคัดลอก แต่ไม่ใช่ต้นฉบับการคัดลอกจะมีค่าเป็นศูนย์ ดัชนีดังกล่าวจะมีอยู่ถ้าหากความยาวที่ระบุนั้นมากกว่าความยาวของอาร์เรย์เดิม อาร์เรย์ที่ได้นั้นมีคลาสเดียวกันกับอาร์เรย์ดั้งเดิม
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 }
หรือArrays.copyOfRange()
จะทำเคล็ดลับ:
public static <T> T[] copyOfRange(T[] original, int from, int to)
คัดลอกช่วงที่ระบุของอาร์เรย์ที่ระบุลงในอาร์เรย์ใหม่ ดัชนีเริ่มต้นของช่วง (จาก) จะต้องอยู่ระหว่างศูนย์และดั้งเดิมความยาวรวม ค่าที่ต้นฉบับ [จาก] ถูกวางลงในองค์ประกอบเริ่มต้นของการคัดลอก (ยกเว้นจาก == original.length หรือจาก == ถึง) ค่าจากองค์ประกอบที่ตามมาในอาร์เรย์เดิมจะถูกวางไว้ในองค์ประกอบที่ตามมาในการคัดลอก ดัชนีสุดท้ายของช่วง (ถึง) ซึ่งจะต้องมากกว่าหรือเท่ากับอาจสูงกว่าความยาวเดิมซึ่งในกรณีนี้ null จะถูกวางไว้ในองค์ประกอบทั้งหมดของสำเนาที่มีดัชนีมากกว่าหรือเท่ากับต้นฉบับ ความยาว - จาก ความยาวของอาร์เรย์ที่ส่งคืนจะเป็นไป - จาก อาร์เรย์ที่ได้นั้นมีคลาสเดียวกันกับอาร์เรย์ดั้งเดิม
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 }
อย่างที่คุณเห็นทั้งสองฟังก์ชั่นนี้เป็นเพียงแค่ wrapper function ที่System.arraycopy
มีตรรกะการป้องกันซึ่งสิ่งที่คุณพยายามทำนั้นถูกต้อง
System.arraycopy
เป็นวิธีที่เร็วที่สุดในการคัดลอกอาร์เรย์