Saya memulakan urutan baharu untuk membandingkan cara berbeza untuk mengekodkan fungsi yang sama. Dalam siaran ini, saya akan membandingkan dua kaedah biasa untuk membuat senarai ringkas dengan hanya satu elemen. Secara khususnya, saya akan memeriksa pembina pelaksanaan Senarai yang paling biasa digunakan dan Collections.singletonList, Kaedah Kilang yang mudah untuk mencipta senarai tidak berubah yang mengandungi satu elemen.
Setiap kali anda memulakan ArrayList tanpa menyatakan kapasiti awalnya, ia bermula dengan tatasusunan kosong. Apabila anda menambah elemen pertama, ArrayList mengubah saiz menggunakan algoritma yang agak rumit yang melibatkan penyalinan tatasusunan. Mari kita lihat struktur ArrayList:
private static final int DEFAULT_CAPACITY = 10; private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}; public ArrayList() { this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA; } public boolean add(E e) { modCount++; add(e, elementData, size); return true; } private void add(E e, Object[] elementData, int s) { if (s == elementData.length) elementData = grow(); elementData[s] = e; size = s + 1; } private Object[] grow() { return grow(size + 1); } private Object[] grow(int minCapacity) { return elementData = Arrays.copyOf(elementData, newCapacity(minCapacity)); } private int newCapacity(int minCapacity) { // overflow-conscious code int oldCapacity = elementData.length; int newCapacity = oldCapacity + (oldCapacity >> 1); if (newCapacity - minCapacity <= 0) { if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) return Math.max(DEFAULT_CAPACITY, minCapacity); if (minCapacity < 0) // overflow throw new OutOfMemoryError(); return minCapacity; } return (newCapacity - MAX_ARRAY_SIZE <= 0) ? newCapacity : hugeCapacity(minCapacity); }
Berikut ialah perkara yang berlaku langkah demi langkah:
Proses mengubah saiz ini agak rumit apabila anda hanya memerlukan senarai ringkas yang sentiasa mengandungi satu elemen.
Maksudnya, mari bercakap tentang alternatif kami!
statik awam Kaedah ini mengembalikan senarai tidak berubah yang mengandungi hanya objek yang ditentukan. Diperkenalkan dalam Java 1.3, singletonList mempunyai beberapa kelebihan: Ketidakbolehubah: Mari kita lihat pelaksanaannya: Senarai Abstrak, yang diwarisi SingletonList, mentakrifkan semua kaedah boleh ubah seperti ini: Ini memastikan bahawa adalah mustahil untuk melaungkan saiz senarai atau kandungan elemen tunggalnya. Ketidakbolehubahan ialah ciri yang sangat berfaedah. Walaupun saya tidak akan membincangkannya di sini, pembangun yang berminat boleh mengetahui lebih lanjut daripada artikel ini. Peruntukan Memori: Kelas SingletonList mengandungi hanya satu medan mudah untuk menampung elemen tunggal, tidak seperti ArrayList, yang menggunakan tatasusunan yang, menggunakan pembina ringkas ArrayList ringkas, akan meninggalkan kita dengan tatasusunan dengan saiz 10 selepas penambahan elemen. Penggunaan CPU: Pembina SingletonList menerima elemen tunggal sebagai parameter, tidak memerlukan saiz semula, salinan tatasusunan atau manipulasi. Ini jauh lebih cekap berbanding kaedah tambah ArrayList. Dalam siaran ini, kami membandingkan dua cara untuk membuat senarai ringkas dengan satu elemen: menggunakan kaedah ArrayListconstructor dan Collection.singletonList. Walaupun ArrayList ialah struktur data yang fleksibel dan biasa digunakan, ia disertakan dengan beberapa overhed yang tidak perlu, terutamanya dari segi peruntukan memori dan penggunaan CPU semasa menambah elemen. Overhed ini termasuk mengubah saiz dan menyalin tatasusunan, yang boleh menjadi berlebihan untuk senarai yang bertujuan untuk memegang hanya satu elemen. Walau bagaimanapun, jika anda perlu menukar elemen ini, ArrayList ialah penyelesaian yang sesuai. Sebaliknya, Collection.singletonList menawarkan alternatif yang lebih cekap untuk mencipta senarai elemen tunggal. Kaedah ini bukan sahaja lebih ringkas dan lebih mudah digunakan tetapi juga memastikan kebolehubahan, yang boleh menjadi kelebihan ketara dalam banyak senario. Ia mempunyai jejak memori yang minimum dan hampir tidak memerlukan sumber CPU berbanding ArrayList. Ringkasnya, untuk senarai ringkas dan tidak berubah yang mengandungi hanya satu elemen, Collection.singletonList ialah pilihan terbaik kerana kecekapan, kesederhanaan dan kebolehubahannya. Walau bagaimanapun, jika anda perlu mengubah suai elemen dalam senarai, ArrayList boleh menjadi pilihan yang lebih sesuai. Pada catatan seterusnya saya akan membandingkan alternatif lain untuk senarai elemen tunggal: Senarai kaedah kilang. Jumpa anda nanti! Atas ialah kandungan terperinci [Kod Bandingkan] ArrayList lwn Collections.singletonList. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!
Penerangan
private static class SingletonList<E> extends AbstractList<E>
implements RandomAccess, Serializable {
private final E element;
SingletonList(E obj) {
element = obj;
}
...
}
public boolean add(E e) {
add(size(), e);
return true;
}
public void add(int index, E element) {
throw new UnsupportedOperationException();
}
public E remove(int index) {
throw new UnsupportedOperationException();
}
public E set(int index, E element) {
throw new UnsupportedOperationException();
}
Kesimpulan