Java >> Java tutorial >  >> Tag >> ArrayList

Kapaciteten af ​​en ArrayList versus størrelsen af ​​en Array i Java

1. Oversigt

Java giver os mulighed for at oprette arrays af fast størrelse eller bruge samlingsklasser til at udføre et lignende job.

I denne øvelse skal vi se på forskellen mellem kapaciteten af ​​en ArrayList og størrelsen af ​​et array.

Vi vil også se på eksempler på, hvornår vi bør initialisere ArrayList med en kapacitet og fordele og ulemper med hensyn til hukommelsesforbrug.

2. Eksempel

For at forstå forskellene, lad os først prøve begge muligheder.

2.1. Størrelse af et array

I java er det obligatorisk at angive størrelsen af ​​et array, mens du opretter en ny forekomst af det:

Integer[] array = new Integer[100]; 
System.out.println("Size of an array:" + array.length);

Her oprettede vi et I nteger array af størrelse 100, hvilket resulterede i nedenstående output

Size of an array:100

2.2. Kapaciteten af ​​en ArrayList

Lad os nu oprette en ArrayList  med en startkapacitet på 100:

List<Integer> list = new ArrayList<>(100);
System.out.println("Size of the list is :" + list.size());
Size of the list is :0

Da der endnu ikke er tilføjet elementer, er størrelsen nul.

Lad os nu tilføje et element til listen og kontrollere størrelsen på det:

list.add(10);
System.out.println("Size of the list is :" + list.size());
Size of the list is :1

3. Størrelse i Arrays vs. ArrayList

Nedenfor er nogle store forskelle mellem størrelsen af ​​et array og kapaciteten af ​​en ArrayList.

3.1. Ændring af størrelse

Arrays har en fast størrelse. Når vi initialiserer arrayet med noget int værdi som dens størrelse, kan den ikke ændre sig. Størrelsen og kapaciteten er også lig med hinanden.

ArrayList ’s størrelse og kapacitet er ikke faste. Den logiske størrelse af listen ændres baseret på indsættelse og fjernelse af elementer i den. Dette administreres separat fra dets fysiske lagerstørrelse. Også når tærsklen for ArrayList kapacitet er nået, øger dens kapacitet til at give plads til flere elementer.

3.2. Hukommelsestildeling

Arrayhukommelse tildeles ved oprettelse. Når vi initialiserer et array, allokerer det hukommelsen i henhold til størrelsen og typen af ​​et array. Den initialiserer alle elementer med en nul værdi for referencetyper og standardværdien for primitive typer.

ArrayList ændrer hukommelsesallokering, efterhånden som den vokser. Når vi angiver kapaciteten, mens vi initialiserer ArrayList , tildeler den nok hukommelse til at gemme objekter op til den kapacitet. Den logiske størrelse forbliver 0. Når det er tid til at udvide kapaciteten, oprettes et nyt, større array, og værdierne kopieres til det.

Vi bør bemærke, at der er en speciel singleton 0-størrelse array for tom ArrayList genstande, hvilket gør dem meget billige at skabe. Det er også værd at bemærke, at ArrayList internt bruger en række objektreferencer.

4. Hvornår skal ArrayList initialiseres med Kapacitet

Vi kan forvente at initialisere kapaciteten af ​​en ArrayList når vi kender dens nødvendige størrelse, før vi opretter den, men det er normalt ikke nødvendigt. Der er dog et par grunde til, at dette kan være den bedste løsning.

4.1. Opbygning af en stor ArrayList

Det er godt at initialisere en liste med en indledende kapacitet, når vi ved, at den bliver stor. Dette forhindrer nogle dyre vækstoperationer, når vi tilføjer elementer.

På samme måde, hvis listen er meget stor, kan de automatiske vækstoperationer allokere mere hukommelse end nødvendigt for den nøjagtige maksimale størrelse. Dette skyldes, at mængden, der skal vokse hver gang, beregnes som en andel af størrelsen indtil videre. Så med store lister kan dette resultere i spild af hukommelse.

4.2. Opbygning af små multiple ArrayList s

Hvis vi har mange små samlinger, så er den automatiske kapacitet af en ArrayList kan give en stor procentdel af spildt hukommelse. Lad os sige, at ArrayList foretrækker en størrelse på 10 med et mindre antal elementer, men vi gemmer kun 2 eller 3. Det betyder 70 % spildt hukommelse, hvilket kan have betydning, hvis vi har et stort antal af disse lister.

Indstilling af kapaciteten på forhånd kan undgå denne situation.

5. Undgå spild

Vi skal bemærke, at ArrayList er en god løsning til en container af genstande i fleksibel størrelse, der skal understøtte tilfældig adgang. Det bruger lidt mere hukommelse end et array, men giver et rigere sæt af operationer.

I nogle tilfælde, især omkring store samlinger af primitive værdier, kan standardarrayet være hurtigere og bruge mindre hukommelse.

Til lagring af et variabelt antal elementer, som ikke skal tilgås via indeks, LinkedList kan være mere performant. Det kommer ikke med nogen overhead til hukommelsesstyring.

6. Resumé

I denne korte artikel så vi forskellen mellem kapaciteten af ​​ArrayList  og størrelsen af ​​et array. Vi så også på, hvornår vi skulle initialisere ArrayList med kapacitet og dens fordele med hensyn til hukommelsesforbrug og ydeevne.

Som altid er eksempelkoden tilgængelig på GitHub.


Java tag