1. Hogyan ArrayListépül fel

ArrayListaz elemek tárolására leggyakrabban használt Java osztály. Szóval hogyan működik, ArrayListés miért tetszik mindenkinek annyira?

A szerkezet ArrayListegyszerű és ötletes. Minden ArrayListobjektum két mezőt tartalmaz:

  • Elemek tömbje
  • Változó size, amely a lista elemeinek számát tárolja

Belsőleg egy ArrayListobjektum egy legszokványosabb tömböt tartalmaz! De ez még nem minden. Van egy méretváltozó is , amely a lista hosszát tárolja. Ez így működik:

Kezdetben a listán belüli tömb hossza 10. A sizeváltozó pedig 0.

Ha hozzáad egy elemet a listához, az a tömb 0. cellájában kerül tárolásra, és size1-re nő.

Ha hozzáad még egy elemet, az az 1. cellában kerül tárolásra, és sizeismét 1-gyel nő, és kettővel egyenlő lesz.

Ha hozzáad egy másik elemet, amikor nincs több hely a tömbben, akkor a következő történik a metódusban add():

  1. Létrejön egy új tömb , amely másfélszer akkora, mint az előző
  2. A régi tömb összes eleme átmásolódik az új tömbbe.
  3. Az objektumban ArrayListaz új tömbre való hivatkozás felváltja a régire való hivatkozást .
  4. Az átadott elem az új tömb 10. cellájába kerül mentésre .
  5. A méretváltozó 1-gyel nő, és most 11 lesz

Valami hasonló történik egy elem hozzáadásakor (beszúrásakor) a lista közepén. A meglévő elemeket 1-gyel jobbra toljuk, és az átadott elemet a tömb újonnan felszabadult cellájába írjuk.

Most megvizsgáljuk a listákat tartalmazó legalapvetőbb forgatókönyveket:


2. Elem hozzáadása anArrayList

Nézzük meg, mi történik a listán belül, amikor elemeket adunk hozzá. Közvetlenül az ArrayList objektum létrehozása után valami ilyesmi van a memóriában:

Elem hozzáadása egy ArrayListhez

Van egy ArrayListobjektum, amely két mezőt (két változót) tartalmaz: egy tárolót (a datatömböt) és a tárolt elemek számát ( size). A dataváltozó egy hivatkozást tárol egy tárolóra (tömbre), amely 10 elemet tud tárolni.

Ha úgy döntünk, hogy az 5-ös számot hozzáadjuk a tömbhöz, a következő képet kapjuk:

Elem hozzáadása egy ArrayList-hez 2

A tömb most az 5-ös és az elemet tárolja size == 1.

Ha valaki most meghívja a size()metódust az objektumunkon ArrayList, akkor a visszatérési érték a listában tárolt elemek száma lesz: 1. A listában szereplő elemek száma nem egyezik meg a tömb tárolókapacitásával.

Sem a jelenlegi tárolókapacitás, sem maga a tömb soha nem lesz elérhető (látható) az ArrayListobjektumon kívül. ArrayListEz a belső adat, és mindig is az lesz .

Adjunk hozzá még 7 számot a listához: 10, 20, 30, 40, 50, 60, 70.

A memória most így fog kinézni:

Elem hozzáadása egy ArrayListhez

Ha most meghívja a size()metódust, akkor a 8-as számot adja vissza, ami a lista elemeinek új száma. Ennek az értéknek semmi köze a belső tömb méretéhez.

Fontos:

Ezen a képen van egy túlzott leegyszerűsítés.

Az ArrayListosztály nem tud primitív típusokat tárolni, ezért a típust használja Integerhelyette int. A tároló nem közvetlenül az {5, 10, 20, 30, 40, 50, 60, 70} értékeket tárolja, hanem az objektumokra való hivatkozásokat Integer. Az összes üres cella a konténertárolóban null.



3. Lista hosszának növelése

Nézzük meg, mi történik egy listán belül, ha nincs több üres cella a belső tömbjében.

Tegyük fel, hogy van egy listánk 10 elemből:

A lista hosszának növelése

Úgy döntünk, hogy hozzáadjuk a 100-as számot . Ez történik a módszerben add():

1. lépés – Hozzon létre egy új tömböt:

A lista hosszának növelése 2

2. lépés – Másolja át az összes elemet a régi tömbből az újba:

A lista hosszának növelése 2

3. lépés – Cserélje ki a régi tömböt (módosítsa a hivatkozást az ArrayListobjektum belső tömbjére):

A lista hosszának növelése 3

4. lépés – Adja hozzá az új számot, amiért olyan keményen dolgoztunk:

A lista hosszának növelése 4