JavaRush /Java Blog /Random-ID /new ArrayList(????) bagaimana dan di mana lebih baik untu...
Vovan
Level 22

new ArrayList(????) bagaimana dan di mana lebih baik untuk menginisialisasi

Dipublikasikan di grup Random-ID
Menulis kode tanpa menggunakan kerangka koleksi akan menjadi gila. Ini adalah bagian luar biasa dari Java dengan banyak solusi yang rapi. Lebih penting lagi, tidak seperti array, Anda tidak perlu khawatir tentang ukuran. ArrayList akan bertambah hingga kehabisan memori. Pengembang tidak perlu khawatir tentang ukuran awal dan kesalahan ArrayIndexOutOfBoundsException . Namun bagaimana jika ada syarat untuk memantau jumlah memori? Bisakah kita menggunakan memori secara efisien saat bekerja dengan koleksi?
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.
Jika terdapat 100 elemen, JVM perlu membuat array baru beberapa kali dan menyalin elemen ke dalamnya. Mengingat hal ini, jika ada asumsi tentang ukuran array yang dibutuhkan, lebih baik mengatur kapasitas awal mendekatinya. Berikut adalah beberapa pedoman untuk bertindak:
  1. Buat koleksi hanya saat Anda memerlukannya , jika tidak, inisialisasi ke null atau gunakan Collections.EMPTY_LIST .
  2. Jika Anda mengetahui ukuran pasti yang diperlukan , tentukan di konstruktor koleksi.
  3. Jika Anda yakin jumlah elemen tidak akan melebihi 10 , silakan gunakan konstruktor default.
  4. 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 .
  5. Jika Anda menginisialisasi koleksi terlalu besar di awal metode dan ingin menguranginya, ada metode trimToSize() .
Tentu saja, pedoman ini berlaku ketika bekerja dengan koleksi berbasis array, dan semua ini tidak masuk akal dalam kasus daftar tertaut. Faktanya, permasalahan-permasalahan ini kemungkinan besar tidak akan mematikan program ini, namun jika ada peluang untuk melakukan hal yang lebih baik, mengapa tidak memanfaatkannya. Apakah Anda punya tips bermanfaat lainnya? Sudahkah Anda menemukan cara untuk membuat segalanya berjalan lebih baik? Atau apakah ini semua tidak perlu? Bagaimana menurutmu?
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION