1. Hogyan ArrayList
épül fel
ArrayList
az 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 ArrayList
egyszerű és ötletes. Minden ArrayList
objektum két mezőt tartalmaz:
- Elemek tömbje
- Változó
size
, amely a lista elemeinek számát tárolja
Belsőleg egy ArrayList
objektum 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 size
vá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 size
1-re nő.
Ha hozzáad még egy elemet, az az 1. cellában kerül tárolásra, és size
ismé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()
:
- Létrejön egy új tömb , amely másfélszer akkora, mint az előző
- A régi tömb összes eleme átmásolódik az új tömbbe.
- Az objektumban
ArrayList
az új tömbre való hivatkozás felváltja a régire való hivatkozást . - Az átadott elem az új tömb 10. cellájába kerül mentésre .
- 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:
Van egy ArrayList
objektum, amely két mezőt (két változót) tartalmaz: egy tárolót (a data
tömböt) és a tárolt elemek számát ( size
). A data
vá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:
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 ArrayList
objektumon kívül. ArrayList
Ez 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:
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.
Ezen a képen van egy túlzott leegyszerűsítés.
Az ArrayList
osztály nem tud primitív típusokat tárolni, ezért a típust használja Integer
helyette 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:
Ú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:
2. lépés – Másolja át az összes elemet a régi tömbből az újba:
3. lépés – Cserélje ki a régi tömböt (módosítsa a hivatkozást az ArrayList
objektum belső tömbjére):
4. lépés – Adja hozzá az új számot, amiért olyan keményen dolgoztunk:
GO TO FULL VERSION