Kapacitet ArrayList-a u odnosu na veličinu polja u Javi

1. Pregled

Java nam omogućuje stvaranje nizova fiksne veličine ili korištenje klasa kolekcija za obavljanje sličnog posla.

U ovom uputstvu ćemo pogledati razliku između kapaciteta an ArrayList i veličina niza.

Također ćemo pogledati primjere kada bismo se trebali inicijalizirati ArrayList s kapacitetom i prednostima i nedostacima u pogledu upotrebe memorije.

2. Primjer

Da bismo razumjeli razlike, prvo isprobajmo obje mogućnosti.

2.1. Veličina polja

U javi je obavezno odrediti veličinu niza tijekom stvaranja njegove nove instance:

Integer [] niz = novi Integer [100]; System.out.println ("Veličina niza:" + array.length);

Ovdje smo stvorili Janteger niz veličine 100, što je rezultiralo donjim rezultatom

Veličina niza: 100

2.2. Kapacitet an ArrayList

Ajmo sada stvoriti ArrayList s početnim kapacitetom od 100:

Popis popisa = novi ArrayList (100); System.out.println ("Veličina popisa je:" + list.size ());
Veličina popisa je: 0

Kako još nisu dodani elementi, veličina je nula.

Sad, dodajmo element na popis i provjerimo njegovu veličinu:

list.add (10); System.out.println ("Veličina popisa je:" + list.size ());
Veličina popisa je: 1

3. Veličina u Nizovima vs. ArrayList

Ispod su neke glavne razlike između veličine niza i kapaciteta an ArrayList.

3.1. Izmjena veličine

Nizovi su fiksne veličine. Jednom kada niz inicijaliziramo s nekima int vrijednost kao njegova veličina, ne može se promijeniti. Veličina i kapacitet su međusobno jednaki.

ArrayListVeličina i kapacitet nisu fiksni. Logična veličina popisa mijenja se na temelju umetanja i uklanjanja elemenata u njemu. To se upravlja odvojeno od fizičke veličine pohrane. Također kada je prag od ArrayList Kad se postigne kapacitet, povećava se kapacitet da napravi mjesta za više elemenata.

3.2. Dodjela memorije

Memorija niza dodjeljuje se prilikom stvaranja. Kad inicijaliziramo niz, on dodjeljuje memoriju prema veličini i vrsti niza. Inicijalizira sve elemente s null vrijednost za referentne tipove i zadana vrijednost za primitivne tipove.

ArrayList mijenja raspodjelu memorije kako raste. Kada odredimo kapacitet tijekom inicijalizacije datoteke ArrayList, dodjeljuje dovoljno memorije za pohranu objekata do tog kapaciteta. Logična veličina ostaje 0. Kada je vrijeme za proširenje kapaciteta, stvara se novi, veći niz i vrijednosti se kopiraju u njega.

Trebali bismo imati na umu da postoji poseban singleton niz veličine 0 za prazno ArrayList predmeta, što ih čini vrlo jeftinima za stvaranje. To je također vrijedno napomenuti ArrayList interno koristi niz referenci na objekt.

4. Kada inicijalizirati ArrayList s kapacitetom

Možemo očekivati ​​da inicijaliziramo kapacitet ArrayList kada znamo potrebnu veličinu prije nego što je stvorimo, ali to obično nije potrebno. Međutim, postoji nekoliko razloga zašto je ovo možda najbolja opcija.

4.1. Izgradnja velikog ArrayList

Dobro je inicijalizirati popis početnim kapacitetom kad znamo da će se povećati. To sprječava neke skupe operacije uzgoja dok dodajemo elemente.

Slično tome, ako je popis vrlo velik, operacije automatskog uzgajanja mogu dodijeliti više memorije nego što je potrebno za točnu maksimalnu veličinu. To je zato što se količina za rast svaki put izračunava kao udio dosadašnje veličine. Dakle, kod velikih popisa to bi moglo rezultirati gubitkom memorije.

4.2. Izgradnja male višestruke ArrayLists

Ako imamo puno malih zbirki, automatski automatski ArrayList može pružiti velik postotak izgubljene memorije. Recimo to ArrayList preferira veličinu 10 s manjim brojem elemenata, ali pohranjujemo samo 2 ili 3. To znači 70% izgubljene memorije, što bi moglo biti važno ako imamo ogroman broj ovih popisa.

Unaprijed postavljenim kapacitetom možete izbjeći ovu situaciju.

5. Izbjegavanje otpada

To bismo trebali primijetiti ArrayList dobro je rješenje za spremnik predmeta fleksibilne veličine koji podržava slučajni pristup. Troši malo više memorije od niza, ali pruža bogatiji niz operacija.

U nekim slučajevima korištenja, posebno oko velikih kolekcija primitivnih vrijednosti, standardni niz može biti brži i koristiti manje memorije.

Slično tome, za pohranu promjenjivog broja elemenata kojima ne treba pristupiti indeksom, LinkedList može biti učinkovitiji. Ne dolazi s dodatnim troškovima upravljanja memorijom.

6. Sažetak

U ovom kratkom članku vidjeli smo razliku između kapaciteta sustava ArrayList i veličinu niza. Također smo pogledali kada bismo trebali inicijalizirati ArrayList s kapacitetom i njegovim prednostima s obzirom na upotrebu i performanse memorije.

Kao i uvijek, primjer koda dostupan je na GitHub-u.