1. Untuk pertimbangan kinerja, array lebih disukai
Array semakin jarang digunakan dalam pengembangan proyek, terutama dalam pengembangan berorientasi bisnis. Pertama-tama, array tidak memiliki banyak metode yang disediakan oleh koleksi seperti Daftar dan Kumpulan sangat rumit dan menyusahkan. Namun, Karena koleksi seperti Daftar dan Set menggunakan dukungan umum, semuanya disimpan dalam kelas pembungkus, dan array dapat menggunakan tipe data dasar, kecepatan eksekusi tipe data dasar jauh lebih cepat daripada tipe pembungkus, dan lapisan bawah kelas koleksi Ini juga diimplementasikan melalui array.
2. Jika perlu, gunakan array dengan panjang variabel
Saat mempelajari kelas koleksi, banyak orang suka membandingkan panjang tetap array dengan panjang variabel tipe koleksi, namun nyatanya perbandingan ini kurang tepat Dengan mengamati implementasi kelas koleksi seperti ArrayList, kita sebenarnya bisa melihatnya yang disebut Koleksinya menjadi lebih panjang. Faktanya, itu hanya memperluas susunan aslinya dengan cara yang bijaksana.
Copy kode kodenya sebagai berikut:
public static T[] expandCapacity(T[] data, int newLength) {
// Tentukan apakah nilainya negatif
Panjang baru = Panjang baru < 0 ? 0 : Panjang baru;
// Buat array baru, salin nilai asli dan tentukan panjangnya
return Array.copyOf(data, newLength);
}
Ketika persyaratan kinerja tinggi, Anda dapat mempertimbangkan untuk mengenkapsulasi array. Panjang array yang konstan bukanlah alasan bagi kami untuk tidak menggunakannya.
3. Berhati-hatilah terhadap salinan array yang dangkal
Salinan dangkal array juga merupakan dasar pemrograman Java. Salinan dangkal berarti ketika menyalin array, tipe dasar menyalin nilainya, sedangkan tipe referensi menyalin alamat referensi adalah salinan yang dangkal, jadi Anda perlu memperhatikan saat menggunakannya.
4. Dalam skenario yang jelas, tentukan kapasitas awal pengumpulan
Dalam penggunaan kita sehari-hari, karena tipe koleksi secara otomatis berubah panjangnya, nilai awal tidak akan dilampirkan ke kelas koleksi saat membuat objek. Mari kita ambil ArrayList yang paling umum digunakan sebagai contoh. Pertama-tama kita perlu mengetahuinya saat mengumpulkan kapasitas tercapai Pada titik kritis, array yang mendasarinya akan berada Operasi copyOf menghasilkan array baru, dan kapasitas array baru adalah 1,5 kali lipat dari array lama, dan panjang array default adalah 10. Ketika kita mengetahui dengan jelas bahwa jumlah data yang akan ditempatkan dalam wadah besar, kita harus menentukan nilai awal untuk menghindari overhead Kinerja berlebihan yang disebabkan oleh penggunaan waktu copyOf
5. Pilih algoritma optimal yang sesuai
Mencari nilai data maksimum atau minimum adalah pengetahuan paling dasar tentang struktur data. Kami juga memiliki banyak cara untuk mengimplementasikannya di Java.
Copy kode kodenya sebagai berikut:
publik statis int getMaxByArray(int[] data) {
//Metode pencarian paling sederhana yang diterapkan sendiri
int maks = data[0];
for (int i = 1, ukuran = data.panjang; i < ukuran; i++) {
maks = maks < saya ?
}
pengembalian maks;
}
Copy kode kodenya sebagai berikut:
publik statis int getMaxByArray(int[] data) {
// Urutkan terlebih dahulu lalu ambil bagian terakhir
Array.sort(data);
mengembalikan data[data.panjang - 1];
}
6. Perangkap konversi array tipe dasar!
Silakan perhatikan kode berikut
Copy kode kodenya sebagai berikut:
public static void main(String[] args) {
int[] angka = baru int[] { 1, 2, 3, 4, 5 };
Daftar daftar = Arrays.asList(nums);
Sistem.keluar.println(daftar.ukuran());
//Ukuran keluaran saat ini adalah 1
}
Hasil yang kami harapkan adalah mengubah elemen-elemen dalam array menjadi kelas koleksi melalui Arrays.asList, tetapi bertentangan dengan harapan, kami hanya menambahkan array itu sendiri dan tidak memisahkan nilai-nilai dalam array. jika koleksi Menambahkan obat generik ke Daftar akan memberikan pesan kesalahan selama kompilasi, atau mengubah array itu sendiri ke Integer dapat menyelesaikan masalah.
7. Objek Daftar yang dihasilkan oleh metode asList tidak dapat diubah.
Melalui contoh di atas, kita dapat melihat bahwa menggunakan metode Arrays.asList dapat mengubah array menjadi Daftar. Jadi apa yang istimewa dari Daftar yang dikembalikan oleh metode asList? Perhatikan bahwa Daftar yang dikembalikan tidak mendukung perubahan karena metode asList kembali bukan Java.util.ArrayList, tapi Array Kelas internal pribadi statis di kelas alat s, meskipun memiliki kelas induk AbstrakList yang sama dengan ArrayList, tetapi ketika mengganti add dan metode lainnya, UnsupportedOperationException dilemparkan. Kelas internal pribadi statis ini hanya mengimplementasikan ukuran, toArray, Get, berisi ini metode
8. Gunakan metode traversal yang berbeda untuk struktur data yang berbeda
Silakan perhatikan kode berikut
Copy kode kodenya sebagai berikut:
public static void main(String[] args) {
//Berikut ini adalah metode traversal dari koleksi ArrayList
int angka = 80*10000;
Daftar arrayList = Daftar Array baru(angka);
untuk (int i = 0, ukuran = arrayList.size(); i < ukuran; i++) {
arrayList.dapatkan(i);
}
//Berikut ini adalah metode traversal dari koleksi LinkedList
Daftar linkedList = new LinkedList();
for (Bilangan bulat : linkedList) {
}
}
Mengapa memilih metode traversal yang berbeda untuk LinkedList dan ArrayList?
1. Karena ArrayList mengimplementasikan antarmuka RamdomAccess (antarmuka akses acak), antarmuka RamdomAccess adalah antarmuka penandaan yang sama di Java dengan antarmuka Serializable dan Cloneable, artinya kelas ini dapat diakses secara acak tidak ada korelasi, yaitu dua posisi yang berdekatan tidak mempunyai hubungan saling ketergantungan dan dapat diakses secara acak.
2. Sintaks foreach di Java adalah varian penggunaan iterator (iterator). Kita tahu bahwa iterator adalah salah satu dari 23 pola desain, tetapi iterator perlu mengetahui hubungan waktu antara dua elemen, jika tidak, bagaimana cara memberikan dukungan hasNext Apa? Itu karena elemen sebelumnya perlu menentukan apakah elemen berikutnya ada, dan hubungan ini dibuat secara paksa, yang melanggar karakteristik khusus akses acak ArrayList.
3. Di LinkedList, karena disimpan dalam bentuk daftar tertaut ganda, dukungan untuk iterator sangat baik. Karena ada hubungan yang melekat antara dua elemen yang berdekatan di LinkedList, metode traversal yang berbeda harus diadopsi untuk LinkedList dan ArrayList. Pembaca yang berminat dapat mencoba mengakses LinkedList dalam bentuk subskrip, dan akan menemukan adanya kesenjangan efisiensi yang besar di antara keduanya.
8. Pilih ArrayList atau LinkedList bila perlu
Perbedaan utama antara ArrayList dan LinkedList:
1. Struktur data yang mendasari ArrayList adalah array, sedangkan struktur dasar LinkedList adalah daftar tertaut ganda.
2. Saat memasukkan data, karena ArrayList perlu memindahkan elemen array ke belakang setelah setiap penyisipan, LinkedList hanya perlu mengubah simpul kepala dan simpul ekor untuk menyelesaikan operasi penyisipan, jadi ketika operasi penyisipan lebih sering, LinkedList lebih disukai.
3. Saat menghapus data, karena ArrayList perlu menjaga urutan array, elemen juga perlu digeser ke belakang atau ke depan setelah dihapus, sedangkan LinkedList tetap mengubah node kepala dan ekor.
4. Saat memperbarui, karena LinkedList akan menggunakan metode setengah traversal untuk menemukan elemen yang diposisikan dan kemudian memperbaruinya, dibandingkan dengan penggantian langsung elemen subskrip yang diposisikan oleh ArrayList, ArrayList lebih efisien dalam memperbarui.
5.LinkedList dapat mensimulasikan antrian melalui operasi seperti addFirst dan addLast dari LinkedList.
9. Jika daftarnya sama, Anda hanya perlu memperhatikan data elemennya
Agar kita dapat memprogram antarmuka seperti Daftar, Set, dan Peta dengan tenang, Java telah mengganti equlas di kelas koleksi, sehingga ketika membandingkan apakah dua koleksi sama, kita hanya perlu membandingkan apakah data elemennya sama. Hal ini untuk menghindari Memperbaiki kode Java yang salah yang disebabkan oleh penggantian kelas implementasi koleksi
Copy kode kodenya sebagai berikut:
public static void main(String[] args) {
Daftar arrayList = new ArrayList();
arrayList.tambahkan(1);
arrayList.tambahkan(2);
Daftar linkedList = new LinkedList();
linkedList.tambahkan(1);
linkedList.tambahkan(2);
System.out.println(arrayList.equals(linkedList));
// Tidak peduli dengan implementasi spesifiknya, outputnya benar
}