Teknik Salin Array Java: Panduan Lengkap
Teknik Salin Array Java
Pelajari cara menyalin array satu dimensi dan dua dimensi di Java menggunakan assignment, loops, System.arraycopy, Arrays.copyOfRange, dan lebih banyak lagi, dengan contoh yang jelas dan tips best practices.
1. Menyalin dengan Operator Assignment
Menugaskan satu variabel array ke variabel lain adalah metode paling sederhana. Ini menyalin referensi, bukan data.
class Main { public static void main(String[] args) { int [] numbers = {1, 2, 3, 4, 5, 6}; int [] positiveNumbers = numbers; // reference copy for (int number: positiveNumbers) { System.out.print(number + ", "); } } }
Output:
1, 2, 3, 4, 5, 6
Kedua numbers dan positiveNumbers sekarang menunjuk ke objek array yang sama. Mengubah satu elemen memengaruhi yang lain:
class Main { public static void main(String[] args) { int [] numbers = {1, 2, 3, 4, 5, 6}; int [] positiveNumbers = numbers; numbers[0] = -1; for (int number: positiveNumbers) { System.out.print(number + ", "); } } }
Output:
-1, 2, 3, 4, 5, 6
Ini adalah shallow copy. Untuk menghindari efek samping yang tidak diinginkan, gunakan teknik deep copy.
2. Deep Copy dengan Loop
Mengiterasi setiap elemen dan menetapkannya ke array baru menciptakan salinan independen.
import java.util.Arrays; class Main { public static void main(String[] args) { int [] source = {1, 2, 3, 4, 5, 6}; int [] destination = new int[source.length]; for (int i = 0; i < source.length; ++i) { destination[i] = source[i]; } System.out.println(Arrays.toString(destination)); } }
Output:
[1, 2, 3, 4, 5, 6]
Karena source dan destination adalah objek yang berbeda, modifikasi pada satu tidak memengaruhi yang lain.
3. Menggunakan System.arraycopy()
Metode System.arraycopy Java menawarkan cara bawaan yang cepat untuk menyalin segmen array.
arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
src – array sumber srcPos – indeks awal di sumber dest – array tujuan destPos – indeks awal di tujuan length – jumlah elemen yang disalin
Contoh:
import java.util.Arrays; class Main { public static void main(String[] args) { int[] n1 = {2, 3, 12, 4, 12, -2}; int[] n2 = new int[n1.length]; System.arraycopy(n1, 0, n2, 0, n1.length); System.out.println("n2 = " + Arrays.toString(n2)); int[] n3 = new int[5]; System.arraycopy(n1, 2, n3, 1, 2); System.out.println("n3 = " + Arrays.toString(n3)); } }
Output:
n2 = [2, 3, 12, 4, 12, -2] n3 = [0, 12, 4, 0, 0]
4. Menyalin dengan Arrays.copyOfRange()
Saat Anda perlu array baru yang berisi irisan tertentu, Arrays.copyOfRange adalah pilihan yang ideal.
import java.util.Arrays; class ArraysCopy { public static void main(String[] args) { int[] source = {2, 3, 12, 4, 12, -2}; int[] destination1 = Arrays.copyOfRange(source, 0, source.length); System.out.println("destination1 = " + Arrays.toString(destination1)); int[] destination2 = Arrays.copyOfRange(source, 2, 5); System.out.println("destination2 = " + Arrays.toString(destination2)); } }
Output:
destination1 = [2, 3, 12, 4, 12, -2] destination2 = [12, 4, 12]
5. Menyalin Array 2D dengan Loop
Deep copying array dua dimensi memerlukan menyalin setiap baris secara individual.
import java.util.Arrays; class Main { public static void main(String[] args) { int[][] source = { {1, 2, 3, 4}, {5, 6}, {0, 2, 42, -4, 5} }; int[][] destination = new int[source.length][]; for (int i = 0; i < destination.length; ++i) { destination[i] = new int[source[i].length]; for (int j = 0; j < destination[i].length; ++j) { destination[i][j] = source[i][j]; } } System.out.println(Arrays.deepToString(destination)); } }
Output:
[[1, 2, 3, 4], [5, 6], [0, 2, 42, -4, 5]]
6. Salin Array 2D dengan System.arraycopy()
Ganti inner loop dengan arraycopy untuk kode yang lebih bersih.
import java.util.Arrays; class Main { public static void main(String[] args) { int[][] source = { {1, 2, 3, 4}, {5, 6}, {0, 2, 42, -4, 5} }; int[][] destination = new int[source.length][]; for (int i = 0; i < source.length; ++i) { destination[i] = new int[source[i].length]; System.arraycopy(source[i], 0, destination[i], 0, destination[i].length); } System.out.println(Arrays.deepToString(destination)); } }
Output:
[[1, 2, 3, 4], [5, 6], [0, 2, 42, -4, 5]]