Sebuah pertanyaan standar muncul: bagaimana cara menginisialisasi daftar? Kode di bawah ini tidak akan berfungsi: Ini akan mengakibatkan kesalahan kompilasi: Nama variabel lokal mungkin belum diinisialisasi . Spesifikasi Java mengharuskan semua variabel lokal (yang ada di tumpukan) diinisialisasi dengan nilai yang sesuai. Beginilah cara Anda melakukannya: Tanpa ragu, daftar harus diinisialisasi. Anda dapat membuat daftar di baris pertama, atau Anda dapat melakukan sesuatu yang lebih cerdas dan menggunakan inisialisasi lambat seperti yang kami lakukan pada metode getAllNames() . Dalam hal ini, daftar hanya akan dibuat bila diperlukan - jika kondisi awal tidak terpenuhi, daftar tidak akan pernah muncul di heap. Di sini kita sampai pada pertanyaan utama: ukuran apa yang harus kita tetapkan untuk daftarnya? Pilihan terbaik adalah memberinya ukuran yang tepat. Misalnya: Dalam kasus ini, tepat n nama harus dikembalikan, dan sebagai konsekuensinya, kumpulan n elemen dibuat. Namun nilai pasti dari n tidak selalu diketahui. Bahkan dalam contoh yang diberikan, bagaimana jika n=1000 dan hanya tersedia 100 nama? Saat bekerja dengan koleksi, metode paling populer adalah memanggil konstruktor default. Jika Anda melihat kode sumber Java (versi 1.6) Seperti yang Anda lihat, secara default daftar 10 elemen dibuat . Artinya, kita dapat menggunakan konstruktor default dengan aman ketika kita tidak berencana menyimpan lebih dari 10 elemen dalam daftar. Apa yang terjadi jika Anda mencoba menambahkan elemen ke-11? Yah, tidak ada salahnya... elemen akan berhasil ditambahkan. Lihatlah metodenya: Ukuran array dikontrol oleh metode sureCapacity . Ukurannya bertambah 1,5 kali lipat . Array baru dibuat dan elemen dipindahkan ke dalamnya. Jika kita mengatur ukurannya menjadi 10, maka pada elemen ke-11:
public List
getAllNames() { List
names; if (/*необходимые условия выполнены*/) { names = new ArrayList
(); /*заполнение списка*/ } return names; }
List
names = null; List
names = new ArrayList
(); List
names = new ArrayList
(0); List
names = new ArrayList
(size);
public List
getTopNames (int n) { List
names = null; if ( /*необходимые условия выполнены*/) { names = new ArrayList
(n); /*заполнение списка*/ } return names; }
names = new ArrayList
();
/** * Конструирует пустой список с указанной начальной емкостью. * * @param initialCapacity начальная емкость списка * @exception IllegalArgumentException если указанная начальная емкость отрицательна * */ public ArrayList(int initialCapacity) { super(); if (initialCapacity < 0) this.elementData = new Object[initialCapacity]; } /** * Конструирует пустой список с начальной емкостью, равной 10. */ public ArrayList() { this(10); }
public Boolean add(E e) { ensureCapacity(size + 1); //увеличивает modCount!! elementData[size++] = e; return true; }
public void ensureCapacity (int minCapacity) { modCount++; int oldCapacity = elementData.length; if (minCapacity > oldCapacity) { throw new IllegalArgumentException(“Illegal Capacity: ” + initialCapacity); Object oldData[] = elementData; int newCapacity = (oldCapacity * 3) / 2 + 1; if (newCapacity < minCapacity) newCapacity = minCapacity; // minCapacity обычно ближе к размеру, так что это беспроигрышно: elementData = Arrays.copyOf(elementData, newCapacity); } }
- ukurannya berubah menjadi 10*3/2+1=16
- kenaikan selanjutnya = 16 * 3 / 2 + 1 = 25
- kenaikan selanjutnya = 25 * 3 / 2 + 1 = 39 dan seterusnya.
- Buat koleksi hanya saat Anda memerlukannya , jika tidak, inisialisasi ke null atau gunakan Collections.EMPTY_LIST .
- Jika Anda mengetahui ukuran pasti yang diperlukan , tentukan di konstruktor koleksi.
- Jika Anda yakin jumlah elemen tidak akan melebihi 10 , silakan gunakan konstruktor default.
- Risiko yang terkait dengan pembuatan koleksi berukuran nol adalah frekuensi pembuatan array baru dan penyalinan data mungkin lebih tinggi. Anda perlu memikirkan dengan hati-hati apakah manfaat menggunakan koleksi ukuran nol benar-benar besar .
- Jika Anda menginisialisasi koleksi terlalu besar di awal metode dan ingin menguranginya, ada metode trimToSize() .
GO TO FULL VERSION