Kapasiteten til en ArrayList mot størrelsen på en Array i Java

1. Oversikt

Java lar oss lage matriser av fast størrelse eller bruke samlingsklasser for å gjøre en lignende jobb.

I denne opplæringen skal vi se på forskjellen mellom kapasiteten til en ArrayList og størrelsen på en serie.

Vi vil også se på eksempler på når vi skal initialisere ArrayList med kapasitet og fordeler og ulemper når det gjelder minnebruk.

2. Eksempel

For å forstå forskjellene, la oss først prøve begge alternativene.

2.1. Størrelse på en matrise

I java er det obligatorisk å spesifisere størrelsen på en matrise mens du oppretter en ny forekomst av den:

Heltall [] array = nytt Heltall [100]; System.out.println ("Størrelse på en matrise:" + array.length);

Her opprettet vi en Jegnteger matrise av størrelse 100, noe som resulterte i utdataene nedenfor

Størrelse på en matrise: 100

2.2. Kapasitet til en ArrayList

La oss nå lage en ArrayList med en innledende kapasitet på 100:

Listeliste = ny ArrayList (100); System.out.println ("Størrelsen på listen er:" + list.size ());
Størrelsen på listen er: 0

Siden ingen elementer er lagt til ennå, er størrelsen null.

La oss nå legge til et element i listen og sjekke størrelsen på den:

list.add (10); System.out.println ("Størrelsen på listen er:" + list.size ());
Størrelsen på listen er: 1

3. Størrelse i arrays vs. ArrayList

Nedenfor er noen store forskjeller mellom størrelsen på en matrise og kapasiteten til en ArrayList.

3.1. Endring av størrelse

Arrays har fast størrelse. Når vi initialiserer matrisen med noen int verdien som størrelse, kan den ikke endres. Størrelsen og kapasiteten er lik hverandre.

ArrayListStørrelse og kapasitet er ikke fast. Den logiske størrelsen på listen endres basert på innsetting og fjerning av elementer i den. Dette administreres separat fra den fysiske lagringsstørrelsen. Også når terskelen til ArrayList kapasitet er nådd, øker den kapasiteten til å gi plass til flere elementer.

3.2. Minnetildeling

Arrayminne tildeles ved opprettelsen. Når vi initialiserer en matrise, fordeler den minnet i henhold til størrelsen og typen av en matrise. Den initialiserer alle elementene med en null verdi for referansetyper og standardverdien for primitive typer.

ArrayList endrer minnetildeling etter hvert som den vokser. Når vi spesifiserer kapasiteten mens vi initialiserer ArrayList, det tildeler nok minne til å lagre objekter opp til den kapasiteten. Den logiske størrelsen forblir 0. Når det er på tide å utvide kapasiteten, opprettes en ny, større matrise, og verdiene kopieres til den.

Vi bør merke oss at det er en spesiell singleton 0-størrelse matrise for tom ArrayList objekter, noe som gjør dem veldig billige å lage. Det er også verdt å merke seg det ArrayList bruker internt en rekke objektreferanser.

4. Når skal initialiseres ArrayList med kapasitet

Vi kan forvente å initialisere kapasiteten til en ArrayList når vi vet den nødvendige størrelsen før vi lager den, men det er vanligvis ikke nødvendig. Det er imidlertid noen grunner til at dette kan være det beste alternativet.

4.1. Å bygge et stort ArrayList

Det er bra å initialisere en liste med innledende kapasitet når vi vet at den vil bli stor. Dette forhindrer noen kostbare vekstoperasjoner når vi legger til elementer.

På samme måte, hvis listen er veldig stor, kan de automatiske vekstoperasjonene tildele mer minne enn nødvendig for den eksakte maksimale størrelsen. Dette er fordi mengden som skal vokse hver gang blir beregnet som en andel av størrelsen så langt. Så med store lister kan dette resultere i bortkastet minne.

4.2. Bygge små flere ArrayLists

Hvis vi har mange små samlinger, vil den automatiske kapasiteten til en ArrayList kan gi en stor prosentandel av bortkastet minne. La oss si det ArrayList foretrekker en størrelse på 10 med mindre antall elementer, men vi lagrer bare 2 eller 3. Det betyr 70% bortkastet minne, noe som kan ha betydning om vi har et stort antall av disse listene.

Å sette kapasiteten på forhånd kan unngå denne situasjonen.

5. Unngå avfall

Vi bør merke oss det ArrayList er en god løsning for en beholder med fleksible størrelser med objekter som skal støtte tilfeldig tilgang. Den bruker litt mer minne enn en matrise, men gir et rikere sett med operasjoner.

I noen bruksområder, spesielt rundt store samlinger av primitive verdier, kan standardmatrisen være raskere og bruke mindre minne.

På samme måte, for lagring av et variabelt antall elementer som ikke trenger å få tilgang til med indeks, LinkedList kan være mer performant. Det følger ikke med noen overhead for minnehåndtering.

6. Sammendrag

I denne korte artikkelen så vi forskjellen mellom kapasiteten til ArrayList og størrelsen på en matrise. Vi så også på når vi skulle initialisere ArrayList med kapasitet og fordelene med hensyn til minnebruk og ytelse.

Som alltid er eksempelkoden tilgjengelig på GitHub.


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