Szia! A mai lecke
Nehezebb lesz, mert ma benézünk a motorháztető alá,
Először nézzük meg, hogyan néz ki az új elemek hozzáadása. Az első feladat annak ellenőrzése, hogy a belső tömbben van-e elég hely a belső tömbben , és hogy elfér-e még egy elem. Ha van hely, akkor az új elem a lista végére kerül. Amikor azt mondjuk, hogy "a végéig", nem a tömb utolsó pozíciójára gondolunk (ez furcsa lenne). Az utolsó aktuális elemet követő pozíciót értjük. Az indexe a következő lesz
Ez elég világos. Mi történik, ha középre, azaz más elemek közé illesztjük be?
új elemünk bekerül a helyére. Az előző elem (bugatti) már át lett másolva onnan egy új helyre.
Most nézzük meg, hogyan történik ez a folyamat, ha nincsenek helyek, ahol új elemeket lehet beilleszteni a tömbbe.
Természetesen először ellenőrizni kell, hogy van-e elég hely. Ha nincs elég hely, akkor egy új tömb jön létre benne
A régi tömböt a szemétgyűjtő törli, és csak az új, kibővített tömb marad meg. Most van hely egy új elemnek. A 3. pozícióba helyezzük be, ami foglalt. Most kezdődik az ismerős eljárás. Az összes elem, a 3-as indextől kezdve, egy pozícióval jobbra tolódik, és az új elem halkan hozzáadásra kerül.
És kész a beillesztés! És készen is vagyunk a beillesztéssel. Most beszéljünk az elemek eltávolításáról . Emlékszel, hogy problémába ütköztünk a tömbökkel való munka során: az elemek eltávolítása "lyukakat" képez a tömbön.minden eltávolításnál, és minden alkalommal meg kellett írnunk a saját kódunkat, hogy végrehajtsuk ezt a váltást. Az ArrayList ugyanezt az elvet követi, de már megvalósítja ezt a mechanizmust.
Így néz ki:
És a végén megkapjuk, amit akarunk:
Az
A program futása közben 77 elemet eltávolítunk, így csak 11 marad:
Kitaláltad már, mi a probléma? Érted, nem hatékony memóriahasználat! Itt csak 11 pozíciót használunk, de 88 elemhez foglaltunk memóriát. Ez 8-szor több a kelleténél! Ebben az esetben optimalizálhatjuk memóriahasználatunkat az
Most már csak annyi memóriát foglaltunk le, amennyire szükségünk van! :)
ArrayList
könnyebb és nehezebb lesz, mint az előző leckék.
![ArrayList képekben - 1](https://cdn.codegym.cc/images/article/bd72f32f-84a4-4872-8506-cc0f15be811f/512.jpeg)
ArrayList
és tanulmányozzuk, mi történik a különböző műveletek során. Másrészt ennek a leckének szinte semmilyen kódja nem lesz. Leginkább képek és magyarázatok. Na, gyerünk:) Mint már tudjátok, ArrayList
van benne egy közönséges tömb, ami adattárként működik. A legtöbb esetben nem adjuk meg a lista pontos méretét. De a belső tömbnek kell lennie valami méretnek! És így is van. Az alapértelmezett mérete 10 .
public static void main(String[] args) {
ArrayList<Car> cars = new ArrayList<>();
}
![ArrayList képekben - 2](https://cdn.codegym.cc/images/article/995c81c6-d02a-42ec-9721-c81c3f70e8c1/800.jpeg)
cars.size()
. A listánk jelenleg üres ( cars.size() == 0
). Ennek megfelelően az új elem a 0 pozícióba kerül.
ArrayList<Car> cars = new ArrayList<>();
Car ferrari = new Car("Ferrari 360 Spider");
cars.add(ferrari);
![ArrayList képekben - 3](https://cdn.codegym.cc/images/article/bea45432-cdfb-48c8-b50c-9197b877ce79/800.jpeg)
public static void main(String[] args) {
ArrayList<Car> cars = new ArrayList<>();
Car ferrari = new Car("Ferrari 360 Spider");
Car bugatti = new Car("Bugatti Veyron");
Car lambo = new Car("Lamborghini Diablo");
Car ford = new Car("Ford Modneo");
cars.add(ferrari);
cars.add(bugatti);
cars.add(lambo);
cars.add(1, ford);// add ford to cell 1, which is already occupied
}
Ismét először meg kell vizsgálni, hogy van-e elég hely a tömbben. Ha van elég hely, akkor az elemek jobbra tolódnak el , kezdve azzal a pozícióval, ahol az új elemet beszúrjuk. Az 1. pozícióba szúrjuk be. Más szóval, a 3. pozícióból a 4. pozícióba, a 2. elem a 3. pozícióba, az 1. elem pedig a 2. pozícióba kerül átmásolásra. Ezután az ![ArrayList képekben - 4](https://cdn.codegym.cc/images/article/d29292f8-43de-488d-9a42-dd76fafc1f3f/800.jpeg)
![ArrayList képekben - 5](https://cdn.codegym.cc/images/article/3c048a88-7fb5-4d37-9b64-c1062b547b9d/800.jpeg)
![ArrayList képekben - 6](https://cdn.codegym.cc/images/article/f6f7ad5c-12bc-4736-896b-fd5b151a9b9b/800.jpeg)
ArrayList
amelynek mérete a régi tömb mérete szorozva 1,5 plusz 1 Esetünkben az új tömb mérete 16 lesz. Az összes aktuális elem azonnal oda lesz másolva. ![ArrayList képekben - 7](https://cdn.codegym.cc/images/article/3661fa3e-117b-4c13-8653-70795cace07c/800.jpeg)
![ArrayList képekben - 8](https://cdn.codegym.cc/images/article/7db23aa9-6d50-4254-97fa-e0c5ae3cc6d1/800.jpeg)
![ArrayList képekben - 9](https://cdn.codegym.cc/images/article/c16de7b1-d4e6-44e4-95e7-705dd30627ec/800.jpeg)
![ArrayList képekben - 10](https://cdn.codegym.cc/images/article/a8b06b39-d4e4-4f8f-af8a-c00062cc02e3/800.jpeg)
![ArrayList képekben - 11](https://cdn.codegym.cc/images/article/afaeece9-9089-4778-a185-3495de62bd5e/800.jpeg)
lambo
elemet eltávolították. Itt eltávolítottunk egy elemet a közepéről. Nyilvánvaló, hogy egy elem eltávolítása a lista végéről gyorsabb, mivel az elemet egyszerűen eltávolítják anélkül, hogy az összes többit el kellene tolni. Beszéljünk ismét egy pillanatra a belső tömb méreteiről és a memóriában való elrendezéséről. Egy tömb bővítése bizonyos erőforrásokat igényel. Ennek megfelelően ne hozzon létre egyArrayList
az alapértelmezett mérettel, ha biztos benne, hogy legalább 100 elemből áll. A belső tömböt hatszor kell bővíteni a 100. elem beszúrásáig, és az összes elemet minden alkalommal el kell tolni.
- 10 elemtől 16-ig
- 16 elemtől 25-ig
- 25-től 38-ig
- 38-tól 58-ig
- 58-tól 88-ig
- 88-tól 133-ig (azaz a régi tömb mérete 1,5 plusz 1)
ArrayList<Car> cars = new ArrayList<>(100);
Most a 100 elemből álló tömb memóriája egyszerre lesz lefoglalva, így a tömb hatékonyabb lesz (nem kell bővíteni). Ennek a stratégiának van egy másik oldala is. Ha objektumokat távolít el egy tömbből ArrayList
, a belső tömb mérete nem csökken automatikusan. Tegyük fel, hogy van egy ArrayList
teljesen teljes, 88 elemből álló belső tömbünk: ![ArrayList képekben - 12](https://cdn.codegym.cc/images/article/a2216fd0-f471-427d-8d04-69ad922d374c/800.jpeg)
![ArrayList képekben - 13](https://cdn.codegym.cc/images/article/6c3142cd-46c7-487a-965f-804f9350bdb7/800.jpeg)
ArrayList
osztály egyik speciális metódusával:trimToSize()
. Ez a módszer "levágja" a belső tömb hosszát a benne jelenleg tárolt elemek számára. ![ArrayList képekben - 14](https://cdn.codegym.cc/images/article/8203feaf-e474-485c-ad4c-b1205f6388b3/800.jpeg)
További olvasnivalók: |
---|
GO TO FULL VERSION