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.
- Collectionygyndy diňe zerur bolanda dörediň , ýogsam kolleksiýalary ýatyrmak ýa-da ulanmak üçin başlaň.EMPTY_LIST .
- Talap edilýän takyk ölçegi bilýän bolsaňyz , kolleksiýa konstruktorynda görkeziň.
- Elementleriň sanynyň 10-dan geçmejekdigine ynanýan bolsaňyz , deslapky konstruktory ulanyp bilersiňiz.
- 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 .
- Usulyň başynda gaty uly kolleksiýa başlasaňyz we ony azaltmak isleseňiz, trimToSize () usuly bar .
GO TO FULL VERSION