JavaRush /Blog Jawa /Random-JV /anyar ArrayList (????) carane lan ngendi iku luwih apik k...
Vovan
tingkat

anyar ArrayList (????) carane lan ngendi iku luwih apik kanggo initialize

Diterbitake ing grup
Nulis kode tanpa nggunakake kerangka koleksi bakal edan. Iki minangka potongan Jawa sing apik banget kanthi solusi sing apik. Sing luwih penting, ora kaya array, sampeyan ora perlu kuwatir babagan ukuran. ArrayList bakal tuwuh nganti entek memori. Pangembang ora perlu kuwatir babagan ukuran awal lan kesalahan ArrayIndexOutOfBoundsException . Nanging apa yen ana syarat kanggo ngawasi jumlah memori? Apa kita bisa nggunakake memori kanthi efisien nalika nggarap koleksi?
Pitakonan standar muncul: carane miwiti dhaptar? Kode ing ngisor iki ora bisa digunakake: Bakal nyebabake kesalahan kompilasi: Jeneng variabel lokal bisa uga durung diinisialisasi . Spesifikasi Jawa mbutuhake kabeh variabel lokal (sing ana ing tumpukan) diinisialisasi kanthi nilai sing cocog. Iki carane sampeyan bisa nindakake iku: Tanpa mangu, dhaftar kudu initialized. Sampeyan salah siji bisa nggawe dhaptar ing baris pisanan, utawa sampeyan bisa nindakake soko pinter lan nggunakake initialization puguh kaya kita ing getAllNames () cara . Ing kasus iki, dhaptar mung bakal digawe yen perlu - yen kondisi awal ora ketemu, dhaftar ora bakal katon ing tumpukan. Ing kene kita teka menyang pitakonan utama: ukuran apa sing kudu diset kanggo dhaptar? Pilihan sing paling apik yaiku menehi ukuran sing tepat. Contone: Ing kasus iki, persis n jeneng kudu bali, lan minangka akibat, koleksi n unsur digawe. Nanging, nilai pas n ora tansah dikenal. Malah ing conto sing diwenehake, apa yen n = 1000 lan mung ana 100 jeneng sing kasedhiya? Nalika nggarap koleksi, cara sing paling populer yaiku nelpon konstruktor standar. Yen katon ing kode sumber Jawa (versi 1.6) Nalika sampeyan bisa ndeleng, minangka standar dhaftar 10 unsur digawe . Sing, kita bisa aman nggunakake konstruktor standar nalika kita ora rencana kanggo nyimpen luwih saka 10 unsur ing dhaftar. Apa sing kedadeyan yen sampeyan nyoba nambah unsur 11? Ya, ora ana sing ala ... unsur kasebut bakal sukses ditambahake. Deleng cara: Ukuran array dikontrol kanthi metode ensureCapacity . Ukuran mundhak 1,5 kaping . Larik anyar digawe lan unsur dipindhah menyang. Yen kita nyetel ukuran dadi 10, banjur ing unsur 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); } }
  • ukuran diganti dadi 10 * 3/2 + 1 = 16
  • mundhak sabanjure = 16 * 3/2 + 1 = 25
  • mundhak sabanjuré = 25 * 3 / 2 + 1 = 39 lan ing.
Ing kasus 100 unsur, JVM kudu nggawe array anyar kaping pirang-pirang lan nyalin unsur kasebut. Nganggep iki, yen ana asumsi babagan ukuran array sing dibutuhake, luwih becik nyetel kapasitas awal sing cedhak. Ing ngisor iki sawetara pedoman kanggo tumindak:
  1. Gawe koleksi mung nalika sampeyan butuh , yen ora, gawe wiwitan dadi null utawa gunakake Collections.EMPTY_LIST .
  2. Yen sampeyan ngerti ukuran pas dibutuhake , nemtokake ing konstruktor koleksi.
  3. Yen sampeyan yakin manawa jumlah unsur ora ngluwihi 10 , gunakake konstruktor standar.
  4. Resiko sing ana gandhengane karo nggawe koleksi ukuran nol yaiku frekuensi nggawe array anyar lan nyalin data bisa uga luwih dhuwur. Sampeyan kudu mikir kanthi ati-ati apa keuntungan nggunakake koleksi ukuran nol pancen apik banget .
  5. Yen sampeyan miwiti koleksi gedhe banget ing wiwitan metode lan pengin nyuda, ana cara trimToSize () .
Mesthine, pedoman iki ditrapake nalika nggarap koleksi adhedhasar array, lan ora ana sing bisa ditrapake ing kasus dhaptar sing disambung. Nyatane, masalah kasebut ora bisa dadi pembunuh program, nanging yen ana kesempatan kanggo nindakake luwih apik, kenapa ora nggunakake. Apa sampeyan duwe tips migunani liyane? Apa sampeyan nemokake cara supaya bisa luwih apik? Utawa iki kabeh ora perlu? Piye menurutmu?
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION