Ada tiga perbedaan utama antara array JAVA dan kelas kontainer: efisiensi, tipe, dan kemampuan menyimpan tipe dasar . Di JAVA, array adalah cara paling efisien untuk menyimpan dan mengakses urutan referensi objek secara acak. Array adalah urutan linier sederhana, yang membuat akses elemen menjadi sangat cepat. Namun harga yang harus dibayar untuk hal ini adalah ukuran arraynya tetap dan tidak dapat diubah selama masa pakainya.
Berkat mekanisme generik dan pengemasan otomatis, container kini dapat digunakan dengan tipe primitif semudah array. Baik array maupun container dapat mencegah Anda menyalahgunakannya sampai batas tertentu. Jika keduanya melampaui batas, Anda akan mendapatkan RuntimeException. Satu-satunya keuntungan yang tersisa dari array adalah efisiensi. Namun, jika Anda ingin menyelesaikan masalah yang lebih umum, array mungkin terlalu membatasi, jadi dalam hal ini kebanyakan orang akan tetap memilih container.
Oleh karena itu, jika Anda menggunakan versi JAVA terbaru, Anda sebaiknya memilih container daripada array. Program hanya boleh difaktorkan ulang menjadi array jika kinerja terbukti menjadi masalah dan peralihan ke array akan meningkatkan kinerja.
【inisialisasi】
JAVA memiliki peraturan yang sangat ketat mengenai inisialisasi array, yang secara efektif dapat mencegah penyalahgunaan array. Jika ada kesalahan inisialisasi, Anda akan mendapatkan CompileException alih-alih RuntimeException secara langsung. Tidak ada yang dapat dilakukan dengan referensi array ini sampai array diinisialisasi dengan benar.
Definisi array mencakup array int[] dan array int[]. Umumnya, gaya pertama digunakan untuk memisahkan tipe dari nama variabel.
Ada dua cara untuk menginisialisasi array, inisialisasi statis dan inisialisasi dinamis. Panjangnya harus ditentukan selama inisialisasi. Panjang dimensi pertama dari array multidimensi harus ditunjukkan, dan harus ditentukan dari dimensi tinggi ke rendah. Tindakan inisialisasi bisa berada di mana saja dalam kode, namun metode {} hanya bisa muncul di tempat array dibuat. Lihat program untuk metode inisialisasi spesifik:
arrayA = new int[10]; //Inisialisasi dinamis
System.out.println("panjang arrayA: " + arrayA.panjang);
int[] arrayC = int baru[]{1,2,3,4};
System.out.println("panjang arrayC: " + arrayC.panjang);
//int[] arrayD = new int[1]{1}; //inisialisasi, dimensi, dan nilai inisialisasi yang salah tidak dapat ditentukan secara bersamaan
int[][] arrayE = int baru[1][];
System.out.println("panjang arrayE: " + arrayE.panjang);
//int[][] arrayF = new int[][2]; //Panjang dimensi tinggi harus ditentukan terlebih dahulu
int[][] arrayG = int baru[][]{{1,2,3,4},{5,6,7},{7,24,23,24}};
System.out.println("panjang arrayG: " + arrayG.panjang);
int[][][] arrayH = int baru[][][]{{{1,2,3},{4,5,6},{7,8,9},{10,11,12} }};
System.out.println("panjang arrayH: " + arrayH.panjang);
dummyArray[] arrayI = {new dummyArray(),new dummyArray()}; //Jenis array khusus
System.out.println("panjang arrayI: " + arrayI.panjang);
System.out.println("arrayI[1]: " + arrayI[1].getValue());
dummyArray[] arrayK = dummyArray baru[5];
Sistem.keluar.println("arrayK[0]: " + arrayK[0]); //null
for(int i = 0; i < arrayK.panjang; i++){
arrayK[i] = dummyArray baru();
}
Sistem.keluar.println("arrayK[0]: " + arrayK[0].getValue()); //2
}
}
kelas dummyArray{
suhu int statis pribadi;
pribadi final int arrayValue = temp++;
publik int getValue(){
kembalikan nilai array;
}
}
Keluaran:
panjang arrayB: 5
panjang arrayA: 10
panjang arrayC: 4
panjang arrayE: 1
panjang arrayG: 3
panjang arrayH: 1
panjang arrayI: 2
susunanI[1]: 1
susunanK[0]: nol
susunanK[0]: 2
int[][] arrayB = int baru[10][];
System.out.println("panjang arrayB: " + arrayB.panjang);
int[][] arrayC = int baru[][]{{1,1,1,2,},{1,1,2,3,4,5},{4,5,6,7,7} ,};//Perhatikan koma setelahnya
System.out.println("panjang arrayC: " + arrayC.panjang);
int[][] arrayD = int baru[][]{{1,1,1,2,},{1,1,2,3,4,5},{4,5,6,7,7} ,{}};
System.out.println("panjang arrayD: " + arrayD.panjang);
}
}
Keluaran:
panjang arrayA: 15
panjang arrayB: 10
panjang arrayC: 3
panjang arrayD: 4
[Tugas dan Referensi]
Ketika array JAVA diinisialisasi, array tersebut hanya memiliki referensi ke array tersebut, dan tidak ada ruang penyimpanan yang dialokasikan ke array tersebut. Oleh karena itu, penyalinan antar array tidak bisa begitu saja menggunakan penugasan "=", karena objek yang dioperasikan sama. Prosedur berikut ini:
}
}
Keluaran:
Saya testA, saya tidak berubah: testA
Saya arrayA, saya tidak berubah: arrayB telah berubah
[Salinan susunan]
Cara menyalin array di JAVA:
1. Gunakan loop FOR untuk menyalin semua atau elemen tertentu, yang kurang efisien.
2. Gunakan metode clone untuk mendapatkan nilai array dan bukan referensi. Namun, clone tidak dapat menyalin elemen tertentu dan memiliki fleksibilitas yang rendah.
3. Gunakan metode System.arraycopy(src, srcPos, dest, destPos, length). Pustaka kelas standar Java menyediakan metode statis System.arraycopy(). Menggunakannya untuk menyalin array jauh lebih cepat daripada sistem loop for .arraycopy() adalah untuk Semua tipe kelebihan beban. Baik array tipe dasar maupun array objek dapat disalin menggunakan System.arraycopy(), tetapi array objek hanya menyalin referensi, dan tidak akan ada dua salinan objek. Ini disebut salinan dangkal.
src: larik sumber;
srcPos: posisi awal array sumber yang akan disalin;
tujuan: susunan tujuan;
destPos: posisi awal dimana array tujuan ditempatkan;
length: Panjang salinan.
Catatan: System.arraycopy() tidak melakukan pengemasan otomatis dan pembongkaran otomatis, sehingga kedua array harus bertipe sama atau dapat dikonversi ke array bertipe sama. Pada saat yang sama, metode ini juga dapat digunakan untuk menyalin array itu sendiri.
int[] tes ={0,1,2,3,4,5,6};
System.arraycopy(uji,0,uji,3,3);
Hasilnya adalah: {0,1,2,0,1,2,6};
Prosedur pengujiannya adalah sebagai berikut:
//metode kloning
int[] arrayB = int baru[9];
arrayB = array.klon();
//tes
larikB[1] = 19;
for(int i = 0; i < arrayB.panjang; i++){
Sistem.keluar.cetak(arrayB[i] + ",");
}
Sistem.keluar.println("");
for(int i = 0; i < array.panjang; i++){
Sistem.keluar.cetak(array[i] + ",");
}
Sistem.keluar.println("");
//Metode System.arrayCopy
int[] arrayC = int baru[9];
System.arraycopy(array, 0, arrayC, 0, arrayC.length);
//tes
larikC[1] = 19;
for(int i = 0; i < arrayC.panjang; i++){
Sistem.keluar.cetak(arrayC[i] + ",");
}
Sistem.keluar.println("");
for(int i = 0; i < array.panjang; i++){
Sistem.keluar.cetak(array[i] + ",");
}
}
}
String[][] arrayD = {{"a","b"},{"c","d"}};
String[][] arrayE = {{"a","b"},{"c","d"}};
Sistem.keluar.println(Arrays.deepEquals(arrayD, arrayE));
}
}
[array kembali]
C dan C++ tidak dapat mengembalikan sebuah array, hanya sebuah pointer ke array, karena mengembalikan sebuah array membuat sulit untuk mengontrol siklus hidup array dan dapat dengan mudah menyebabkan kebocoran memori. Java memungkinkan pengembalian array secara langsung, dan dapat didaur ulang melalui mekanisme pengumpulan sampah.
[Konversi Array dan Kontainer] [Tidak dapat mengonversi array tipe dasar]
Konversi array ke Daftar:
int[] larikB = {1,2,3};
Daftar listB = java.util.Arrays.asList(arrayB);
System.out.println("daftarB: "+daftarB);
Bilangan bulat[] larikC = {1,2,3};
Daftar listC = java.util.Arrays.asList(arrayC);
System.out.println("daftarC: " + daftarC);
}
}
Keluaran:
daftarA: [a, b, c]
daftarB: [[I@de6ced]
daftarC: [1, 2, 3]
Ubah Daftar menjadi Array
String[] string = String baru[daftar.ukuran()];
array = daftar.toArray(string);
for(int i = 0, j = array.panjang; i < j; i++){
Sistem.keluar.cetak(array[i] + ",");
}
}
}
Outputnya adalah:
daftar: [tesA, tesB, tesC]
tesA,tesB,tesC
String statis publik[] arrayUnik(String[] array){
Daftar<String> daftar = Daftar Array baru<String>();
for(int i = 0, j = array.panjang; i < j; i++){
if(!list.contains(array[i])){
daftar.tambahkan(array[i]);
}
}
String[] string = String baru[daftar.ukuran()];
String[] arrayUnik = list.toArray(string);
kembalikan arrayUnik;
}
}
Ganda[] arrayB = baru Ganda[1000000];
for(int i = 0, j = arrayB.panjang; i < j; i++){
arrayB[i] = Matematika.ceil(Matematika.acak()*1000);
}
System.out.println("mulai");
startTime panjang = Sistem.currentTimeMillis();
arrayUnik(array);
long endTime = Sistem.currentTimeMillis();
System.out.println("array waktu berjalan unik: " +(endTime - startTime) +"ms");
startTimeB panjang = Sistem.currentTimeMillis();
arrayUnik(arrayB);
long endTimeB = Sistem.currentTimeMillis();
System.out.println("waktu berjalan unik arrayB: " +(endTimeB - startTimeB) +"ms");
}
public static Double[] arrayUnik(Double[] array){
Daftar<Double> daftar = Daftar Array baru<Double>();
for(int i = 0, j = array.panjang; i < j; i++){
if(!list.contains(array[i])){
daftar.tambahkan(array[i]);
}
}
Ganda[] ganda = ganda baru[daftar.ukuran()];
Ganda[] arrayUnik = list.toArray(ganda);
kembalikan arrayUnik;
}
}
Keluaran:
awal
waktu proses unik array: 577ms
waktu proses unik arrayB: 5663ms