Kapacita zoznamu ArrayList proti veľkosti poľa v Jave

1. Prehľad

Java nám umožňuje vytvárať polia pevnej veľkosti alebo používať triedy zbierok na vykonávanie podobnej práce.

V tomto výučbe sa pozrieme na rozdiel medzi kapacitou súboru ArrayList a veľkosť poľa.

Pozrime sa tiež na príklady, kedy by sme mali inicializovať ArrayList s kapacitou a výhodami a nevýhodami z hľadiska využitia pamäte.

2. Príklad

Aby sme pochopili rozdiely, najskôr skúsime obe možnosti.

2.1. Veľkosť poľa

V Jave je povinné určiť veľkosť poľa pri vytváraní jeho novej inštancie:

Celé číslo [] pole = nové celé číslo [100]; System.out.println ("Veľkosť poľa:" + pole.length);

Tu sme vytvorili Janteger pole veľkosti 100, čo malo za následok výstup uvedený nižšie

Veľkosť poľa: 100

2.2. Kapacita ArrayList

Poďme si vytvoriť ArrayList s počiatočnou kapacitou 100:

Zoznam zoznam = nový ArrayList (100); System.out.println ("Veľkosť zoznamu je:" + list.size ());
Veľkosť zoznamu je: 0

Keďže zatiaľ neboli pridané žiadne prvky, veľkosť je nulová.

Teraz pridajme prvok do zoznamu a skontrolujte jeho veľkosť:

list.add (10); System.out.println ("Veľkosť zoznamu je:" + list.size ());
Veľkosť zoznamu je: 1

3. Veľkosť v poliach vs. ArrayList

Ďalej uvádzame niekoľko hlavných rozdielov medzi veľkosťou poľa a kapacitou súboru ArrayList.

3.1. Úprava veľkosti

Polia majú pevnú veľkosť. Akonáhle inicializujeme pole s niektorými int hodnotu ako svoju veľkosť, nemôže sa meniť. Veľkosť a kapacita sú si navzájom rovnako rovné.

ArrayListVeľkosť a kapacita nie sú pevne dané. Logická veľkosť zoznamu sa mení na základe vloženia a odstránenia prvkov v ňom. To sa spravuje oddelene od jeho veľkosti fyzického úložiska. Tiež pri prahu ArrayList kapacita sa zvyšuje, zvyšuje sa jej kapacita, aby sa vytvoril priestor pre viac prvkov.

3.2. Pridelenie pamäte

Pamäť poľa je pridelená pri vytvorení. Keď inicializujeme pole, pridelí pamäť podľa veľkosti a typu poľa. Inicializuje všetky prvky pomocou a nulový hodnota pre referenčné typy a predvolená hodnota pre primitívne typy.

ArrayList mení alokáciu pamäte ako rastie. Keď zadáme kapacitu pri inicializácii ArrayList, vyhradzuje dostatok pamäte na ukladanie objektov do tejto kapacity. Logická veľkosť zostáva 0. Keď je čas na rozšírenie kapacity, vytvorí sa nové, väčšie pole a do neho sa skopírujú hodnoty.

Mali by sme poznamenať, že pre prázdne pole existuje špeciálne pole veľkosti 0 singletonu ArrayList objekty, vďaka čomu je ich vytváranie veľmi lacné. To tiež stojí za zmienku ArrayList interne používa pole odkazov na objekty.

4. Kedy inicializovať ArrayList s kapacitou

Môžeme očakávať, že inicializujeme kapacitu ArrayList keď poznáme jeho požadovanú veľkosť skôr, ako ho vytvoríme, ale zvyčajne to nie je potrebné. Existuje však niekoľko dôvodov, prečo to môže byť najlepšia voľba.

4.1. Budovanie veľkého ArrayList

Je dobré inicializovať zoznam s počiatočnou kapacitou, keď vieme, že sa rozšíri. To bráni niektorým nákladným operáciám rastu, keď pridávame prvky.

Podobne, ak je zoznam veľmi veľký, operácie automatického zväčšenia môžu prideliť viac pamäte, ako je potrebné na presnú maximálnu veľkosť. Je to tak preto, lebo množstvo, ktoré sa má kedykoľvek vypestovať, sa počíta ako pomerná časť doterajšej veľkosti. Pri veľkých zoznamoch by to teda mohlo viesť k strate pamäte.

4.2. Budovanie malého množstva ArrayLists

Ak máme veľa malých zbierok, potom automatická kapacita súboru ArrayList môže poskytnúť veľké percento stratenej pamäte. Povedzme si to ArrayList uprednostňuje veľkosť 10 s menším počtom prvkov, ale ukladáme iba 2 alebo 3. To znamená 70% zbytočnej pamäte, čo by mohlo mať význam, ak máme obrovské množstvo týchto zoznamov.

Predbežné nastavenie kapacity môže zabrániť tejto situácii.

5. Vyvarujte sa odpadu

Mali by sme si to všimnúť ArrayList je dobrým riešením pre kontajner objektov flexibilnej veľkosti, ktorý má podporovať náhodný prístup. Spotrebuje o niečo viac pamäte ako pole, ale poskytuje bohatšiu sadu operácií.

V niektorých prípadoch použitia, najmä pri veľkých zbierkach primitívnych hodnôt, môže byť štandardné pole rýchlejšie a využívať menej pamäte.

Podobne na ukladanie premenlivého počtu prvkov, ku ktorým nie je potrebné získať prístup pomocou indexu, LinkedList môže byť výkonnejšia. To neprichádza so žiadnou réžiou správy pamäte.

6. Zhrnutie

V tomto krátkom článku sme videli rozdiel medzi kapacitou ArrayList a veľkosť poľa. Pozreli sme sa tiež na to, kedy by sme mali inicializovať ArrayList s kapacitou a jej výhodami, pokiaľ ide o využitie a výkon pamäte.

Vzorový kód je ako vždy k dispozícii na GitHub.


$config[zx-auto] not found$config[zx-overlay] not found