Якщо ви повинні працювати з сирими масивами , а не ArrayList
то Arrays
є те , що вам потрібно. Якщо ви подивитеся на вихідний код, це абсолютно найкращі способи отримати копію масиву. У них є хороший захисний програмування, оскільки System.arraycopy()
метод викидає безліч неперевірених винятків, якщо ви подаєте його нелогічними параметрами.
Ви можете використовувати будь- Arrays.copyOf()
який, який буде копіювати з першого Nth
елемента в новий коротший масив.
public static <T> T[] copyOf(T[] original, int newLength)
Копіює вказаний масив, обрізаючи або замінюючи нулями (якщо потрібно), щоб копія мала вказану довжину. Для всіх індексів, які дійсні як в оригінальному масиві, так і в копії, два масиви будуть містити однакові значення. Для будь-яких індексів, які дійсні в копії, але не в оригіналі, копія буде містити null. Такі індекси існуватимуть лише тоді, коли вказана довжина перевищує довжину вихідного масиву. Отриманий масив точно такого ж класу, як і вихідний масив.
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 або від == до). Значення наступних елементів у вихідному масиві розміщуються на наступні елементи в копії. Кінцевий індекс діапазону (до), який повинен бути більшим або рівним від, може бути більшим, ніж original.length, в цьому випадку нуль розміщується у всіх елементах копії, індекс яких більший або рівний оригіналу. довжина - від. Довжина повернутого масиву буде до - від. Отриманий масив точно такого ж класу, як і вихідний масив.
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 }
Як бачимо, обидва ці функції - лише обгорткові функції, System.arraycopy
захищені логікою, що те, що ви намагаєтеся зробити, є дійсним.
System.arraycopy
це абсолютний найшвидший спосіб копіювання масивів.