JavaRush /Java Blog /Random-TK /täze ArrayList (????) nädip we nirede başlamak has gowudy...
Vovan
Dereje

täze ArrayList (????) nädip we nirede başlamak has gowudyr

Toparda çap edildi
Kolleksiýa çarçuwasyny ulanman kod ýazmak däli bolardy. Bu köp sanly çözgütli Java-yň ajaýyp bölegi. Has möhümi, massiwlerden tapawutlylykda ululyklar hakda alada etmeli däl. “ArrayList” ýady gutarýança öser. Öndüriji başlangyç ululygy we ArrayIndexOutOfBoundsException ýalňyşlygy barada alada etmeli däl . Memoryöne ýadyň mukdaryna gözegçilik etmek üçin şert bar bolsa näme etmeli? Kolleksiýalar bilen işleýän wagtymyz ýady tygşytly ulanyp bilerismi?
Adaty bir sorag ýüze çykýar: sanawy nädip başlamaly? Aşakdaky kod işlemez: Toplama ýalňyşlygyna sebäp bolar: varierli üýtgeýän atlar başlamadyk bolmagy mümkin . Java spesifikasiýasy ähli ýerli üýtgeýänleriň (stakada bar bolanlaryň) degişli bahalar bilen başlamagyny talap edýär. Muny nädip edip bilersiňiz: Şübhesiz, sanaw başda bolmaly. Sanawy birinji setirde döredip bilersiňiz, ýa-da has akylly bir zat edip, getAllNames () usulyndaky ýaly ýalta başlangyç ulanyp bilersiňiz . Bu ýagdaýda sanaw diňe zerur bolanda dörediler - başlangyç şertler ýerine ýetirilmese, sanaw hiç wagt üýşmeleňde görünmez. Ine, esasy soraga gelýäris: sanaw üçin haýsy ululygy bellemeli? Iň oňat warianty, takyk ölçegini bermekdir. Mysal üçin: Bu ýagdaýda takyk n atlary yzyna gaýtarylmaly we netijede n elementleriň ýygyndysy döredilýär. Şeýle-de bolsa, n -iň takyk bahasy hemişe belli däl. Berlen mysalda-da n = 1000 we diňe 100 at bar bolsa näme etmeli? Kolleksiýalar bilen işleýän wagtyňyz, iň meşhur usul, deslapky konstruktor diýmekdir. Java deslapky kody (1.6 wersiýa) seretseňiz , görşüňiz ýaly 10 elementiň sanawy döredilýär . .Agny, sanawda 10-dan gowrak elementi saklamagy meýilleşdirmedik wagtymyz deslapky konstruktory arkaýyn ulanyp bileris. 11-nji elementi goşjak bolsaňyz näme bolýar? Bolýar, erbet zat ýok ... element üstünlikli goşular. Usula serediň: Toplumyň ululygy, “Capacity” usuly bilen dolandyrylýar . Ululygy 1,5 esse ýokarlanýar . Täze massiw döredilýär we elementler oňa geçirilýär. Ölçegini 10-a bellän bolsak, 11-nji elementde:
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); } }
  • ululygy 10 * 3/2 + 1 = 16 üýtgeýär
  • indiki ýokarlandyryş = 16 * 3/2 + 1 = 25
  • indiki ýokarlandyryş = 25 * 3/2 + 1 = 39 we ş.m.
100 element bolan ýagdaýynda, JVM birnäçe gezek täze massiw döretmeli we elementleri oňa göçürmeli bolar. Şuny göz öňünde tutup, massiwiň gerekli ululygy barada çaklama bar bolsa, başlangyç kuwwatyny oňa ýakynlaşdyrmak has gowudyr. Hereket üçin käbir görkezmeler:
  1. Collectionygyndy diňe zerur bolanda dörediň , ýogsam kolleksiýalary ýatyrmak ýa-da ulanmak üçin başlaň.EMPTY_LIST .
  2. Talap edilýän takyk ölçegi bilýän bolsaňyz , kolleksiýa konstruktorynda görkeziň.
  3. Elementleriň sanynyň 10-dan geçmejekdigine ynanýan bolsaňyz , deslapky konstruktory ulanyp bilersiňiz.
  4. Nol ölçegli kolleksiýa döretmek bilen baglanyşykly töwekgelçilik , täze massiwleri döretmegiň we maglumatlary göçürmegiň ýygylygynyň has ýokary bolmagydyr. Nol ölçegli kolleksiýalary ulanmagyň peýdasynyň hakykatdanam uludygy hakda gaty ünsli pikirlenmeli .
  5. Usulyň başynda gaty uly kolleksiýa başlasaňyz we ony azaltmak isleseňiz, trimToSize () usuly bar .
Elbetde, bu görkezmeler massiw esasly kolleksiýalar bilen işleýän wagtyňyz ulanylýar we baglanyşyk sanawynda bu zatlaryň hiç biri-de manysy ýok. Aslynda bu problemalar programmanyň ganhorlary bolmagy ähtimal däl, ýöne birneme gowulaşdyrmak üçin mümkinçilik bar bolsa, näme üçin ulanmaly däl? Başga peýdaly maslahatlaryňyz barmy? Işleri has gowulaşdyrmagyň ýollaryny tapdyňyzmy? Ora-da bularyň hemmesi zerur dälmi? Sen näme pikir etýäň?
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION