Eğer değil çiğ dizilerle çalışmak ve gerekiyorsa ArrayList
o zaman Arrays
neye ihtiyacınız vardır. Kaynak koduna bakarsanız, bunlar bir dizinin kopyasını almanın kesinlikle en iyi yoludur. İyi bir savunma programlaması var çünküSystem.arraycopy()
Mantıksal parametreleri beslerseniz yöntem çok sayıda kontrolsüz istisna atar .
Arrays.copyOf()
İlk Nth
öğeden öğeye yeni kısa diziye kopyalanacak olan herhangi birini kullanabilirsiniz .
public static <T> T[] copyOf(T[] original, int newLength)
Belirtilen diziyi keser veya doldurma işlemini null değerleriyle (gerekirse) kopyalar, böylece kopyanın belirtilen uzunluğu olur. Hem orijinal dizide hem de kopyada geçerli olan tüm dizinler için, iki dizi aynı değerleri içerecektir. Kopyada geçerli olan ancak orijinalde olmayan tüm dizinler için, kopya null içerir. Bu tür indeksler, yalnızca belirtilen uzunluk orijinal dizininkinden daha büyükse ve mevcut olacaktır. Sonuçta elde edilen dizi, orijinal diziyle tam olarak aynı sınıftadır.
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 }
ya Arrays.copyOfRange()
da hile yapacak:
public static <T> T[] copyOfRange(T[] original, int from, int to)
Belirtilen dizinin belirtilen aralığını yeni bir diziye kopyalar. Aralığın başlangıç endeksi (itibaren) sıfır ile orijinal arasında olmalıdır. Uzunluk, dahil. Original [from] öğesindeki değer, kopyanın ilk öğesine yerleştirilir (== original.length veya == - arasında değilse). Orijinal dizideki sonraki öğelerin değerleri, kopyadaki sonraki öğelere yerleştirilir. Aralıktan büyük veya ona eşit olması gereken son dizinin orijinal dizini, orijinalden daha büyük olabilir. uzunluk - itibaren. Döndürülen dizinin uzunluğu - arasında olacaktır. Sonuçta elde edilen dizi, orijinal diziyle tam olarak aynı sınıftadır.
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 }
Gördüğünüz gibi, bunların her ikisi de System.arraycopy
, yapmaya çalıştığınız şeyin geçerli olduğu savunma mantığıyla sadece sarmalayıcı işlevleridir .
System.arraycopy
dizileri kopyalamanın en hızlı yoludur.