Salam! Şu günki leksiýa
ArrayList
, bir tarapdan, has ýönekeý we beýleki tarapdan, öňki sapaklardan has kyn bolar. Has kyn, sebäbi bu gün "kapotyň aşagyna" serederis ArrayList
we amallar wagtynda näme bolýandygyny öwreneris. Başga bir tarapdan, bu leksiýada kod ýok diýen ýaly - esasanam suratlar we düşündirişler. Şeýlelik bilen, gideliň :) Bilşiňiz ýaly, içerde ArrayList
maglumat dükany hökmünde hereket edýän adaty bir massiw bar. Köplenç sanawyň takyk ululygyny görkezmeýäris. Internalöne içerki massiwde belli bir ululyk bolmaly! Bu hakykat. Bellenen ululygy [10] .
public static void main(String[] args) {
ArrayList<Car> cars = new ArrayList<>();
}
Ilki bilen, täze element goşmagyň nämä meňzeýändigini göreliň. Ilki bilen içerki massiwde ýeterlik ýeriň bardygyny ýa-da ýene bir elementiň gabat geljekdigini barlamak barlanýar . Boş ýer bar bolsa, sanawyň soňuna täze element goşulýar. “Ahyryna” diýlende, massiwiň soňky öýjügini aňlatmaýarys (bu geň bolar). Bu soňky häzirki elementiň gapdalyndaky öýjügi aňladýar. Onuň görkezijisi deň bolar cars.size()
. Sanawymyz häzirki wagtda boş ( cars.size() = 0
). Şoňa laýyklykda öýjüge indeks bilen täze element goşular 0
.
ArrayList<Car> cars = new ArrayList<>();
Car ferrari = new Car("Ferrari 360 Spider");
cars.add(ferrari);
Bu ýerde hemme zat düşnüklidir. Goýmak ortada, ýagny birnäçe elementiň arasynda amala aşyrylsa näme bolar?
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);//добавляем ford в ячейку 1, которая уже занята
}
Againene-de, ilki bilen massiwde ýeterlik ýeriň bardygyny ýa-da ýokdugyny barlaýar. Enougheterlik ýer bar bolsa, elementler täze elementi goýýan öýjügimizden başlap sag tarapa geçirilýär. 1-nji görkeziji bilen öýjüge ýelmeýäris, ýagny 3-nji öýjükden 4-nji öýjüge, 2-nji elemente 3-nji öýjüge, 1-nji elemente 2-nji öýjüge göçürilýär. Ondan soň täze elementimiz ýerleşdirilýär. Öňki element ( bugatti
) eýýäm ol ýerden täze ýere göçürildi. Indi, massiwde goýmak üçin boş ýer bolmasa, bu prosesiň nähili boljagyny anyklalyň. Ilki bilen, elbetde, ýeterlik ýeriň bardygyny ýa-da ýokdugyny barlaýarlar. Enougheterlik ýer ýok bolsa, ArrayList
“a” -yň içinde täze ululyk (OldArray * 1.5) + 1 massiw döredilýär. Biziň ýagdaýymyzda täze massiw 16 öýjük bolar. Currenthli häzirki elementler derrew şol ýerde göçüriler. Köne massiw hapa ýygnaýjy tarapyndan ýok ediler we diňe täze, giňeldilen galyndy galar. Indi täze element üçin boş ýer bar. Ony eýeleýän 3-nji öýjüge ýelmeýäris. Indi tanyş prosedura başlaýar. 3-nji indeksden başlaýan ähli elementler bir öýjügi saga geçirýär we täze element ýuwaşlyk bilen goşulýar. Indi goýmak üstünlikli! Goýmany düzdük. Indi elementleri aýyrmak barada gürleşeliň . .Adyňyzda bolsa, massiwler bilen işleýän wagtymyz bir mesele bilen ýüzbe-ýüz bolduk: pozanymyzda “deşikler” galypdy. Onlyeke-täk çözgüt, elementler her gezek öçürilende çepe geçirmekdi we smena üçin kod ýazmalydyňyz. ArrayList
şol bir prinsipde işleýär, ýöne onda bu mehanizm eýýäm awtomatiki usulda durmuşa geçirilýär. Görnüşi ýaly: Iň soňunda bolsa islenýän netijäni alýarys: Element lambo
üstünlikli öçürildi. Bu ýerde ortadan aýyrdyk. Sanawyň soňundan pozmagyň has çalt boljakdygy düşnüklidir, sebäbi islenýän element beýlekileriň hemmesini üýtgetmän aýrylýar. Içerki massiwiň ululygyna we ýatda saklanmagyna başga bir göz aýlalyň. Arraýy giňeltmek belli bir mukdarda çeşme talap edýän prosesdir. ArrayList
Şonuň üçin azyndan 100 elementiň boljakdygyny anyk bilýän bolsaňyz, deslapky ululyk bilen döretmeli däl . 100-nji elementi girizip başlanyňyzda içerki massiw her gezek ähli elementleri geçirende 6 esse giňelder.
- 10 elementden 16-a çenli
- 16 elementden 25-e çenli
- 25-den 38-e çenli
- 38-den 58-e çenli
- 58-den 88-e çenli
- 88-den 133-e çenli (formula boýunça (Köne Arraý * 1,5) + 1)
ArrayList<Car> cars = new ArrayList<>(100);
Indi 100 elementden ybarat ýygyndy derrew ýatda saklanar, bu has täsirli bolar, sebäbi çeşmeler giňelmäge sarp edilmez. Şaýy puluň beýleki tarapy hem bar. Jisimler içerki massiwden aýrylanda ArrayList
ululygy awtomatiki azalmaýar. ArrayList
Mysal üçin, 88 elementden ybarat içerki massiwimiz bar , olar doly doldurylýar: Programmanyň işleýşi wagtynda biz ondan 77 elementi aýyrýarys we diňe 11 sanysy galýar: Meseläniň nämedigini eýýäm çakladyňyzmy? Memoryadyň netijesiz ulanylmagy, elbetde! Diňe 11 öýjük ulanýarys, 88 element üçin bölünen ýadymyz bar - bu zerurlykdan 8 esse köp! Bu ýagdaýda optimizasiýany amala aşyrmak üçin ýörite synp usulyny ulanyp bilersiňiz ArrayList
- trimToSize()
. Içki massiwiň uzynlygyny häzirki wagtda saklanýan elementleriň sanyna “kesýär”. Indi näçe zerur bolsa ýat bölünýär! :)
GO TO FULL VERSION