Salam! Recenthli soňky leksiýalar ArrayList sanawyny öwrenmäge bagyşlandy . Bu maglumat gurluşy örän amatly we köp meseläni çözmäge mümkinçilik berýär. Şeýle-de bolsa, Java-da başga-da köp maglumat gurluşy bar. Näme üçin? Ilki bilen, bar bolan meseleleriň gerimi gaty giň we dürli meseleler üçin dürli maglumat gurluşlary has täsirli . Bu gün täze gurluş - iki gezek baglanyşdyrylan LinkedList sanawy bilen tanyşarys . Onuň nähili işleýändigini, näme üçin iki esse baglanyşdyrylýandygyny we ArrayList -den nähili tapawutlanýandygyny öwreneliň . “LinkedList” -de elementler aslynda zynjyrdaky baglanyşyklardyr. Her element, saklaýan maglumatlaryna goşmaça, öňki we indiki element bilen baglanyşygy bar . Bu baglanyşyklar bir elementden beýlekisine geçmäge mümkinçilik berýär. Munuň ýaly döredildi:
public class Main {
public static void main(String[] args) {
String str1 = new String("Hello World!");
String str2 = new String("My name is Earl");
String str3 = new String("I love Java");
String str4 = new String("I live in Moscow");
LinkedList<String> earlBio = new LinkedList<>();
earlBio.add(str1);
earlBio.add(str2);
earlBio.add(str3);
earlBio.add(str4);
System.out.println(earlBio);
}
}
Netije:
[Hello World! My name is Earl, I love Java, I live in Moscow]
Sanawymyzyň gurluşy şeýle bolar: Geliň, täze elementiň nädip goşulandygyny göreliň. Bu ulanylýar add()
.
earlBio.add(str2);
Bu setir kody ýazylanda, sanawymyz bir elementden - setirden durýar str1
. Suratda indiki näme bolýandygyny göreliň: Netijede str2
, str1
olarda saklanýan baglanyşyklar arkaly birleşiň next
we previous
: Indi iki gezek baglanyşdyrylan sanawyň esasy ideýasyna düşünmeli. Elementler LinkedList
bu baglanyşyk zynjyrynyň kömegi bilen ýekeje sanawdyr. Içinde ýa-da şuňa LinkedList
meňzeş ArrayList
bir zat ýok. “ArrayList” bilen işleýänleriň hemmesi (umuman alanyňda) içerki massiw bilen işlemek üçin gelýär. Withhli işler LinkedList
baglanyşyklary üýtgetmek bilen baglanyşykly. Sanawyň ortasyna bir element goşmak bilen muny aýdyň görkezýär:
public class Main {
public static void main(String[] args) {
String str1 = new String("Hello World!");
String str2 = new String("My name is Earl");
String str3 = new String("I love Java");
String str4 = new String("I live in Moscow");
LinkedList<String> earlBio = new LinkedList<>();
earlBio.add(str1);
earlBio.add(str3);
earlBio.add(1, str2);
System.out.println(earlBio);
}
}
Görşüňiz ýaly, artykmaç ýüklenen usul add()
täze element üçin belli bir görkezijini kesgitlemäge mümkinçilik berýär. Bu ýagdaýda, we str2
arasynda bir setir goşmak isleýäris . Içinde boljak zat: Içerki baglanyşyklary üýtgetmegiň netijesinde element sanawa üstünlikli goşulýar: Indi 3 elementiň hemmesi baglanyşdy. Zynjyryň boýundaky birinji elementden iň soňky we yza gidip bilersiňiz. Goýmany has az düşündik, ýöne elementleri pozmak hakda näme? Işleýiş ýörelgesi birmeňzeş. Diňe aýrylýan elementiň “gapdallarynda” iki elementiň baglanyşyklaryny täzeden kesgitleýäris: str1
str3
str2
next
public class Main {
public static void main(String[] args) {
String str1 = new String("Hello World!");
String str2 = new String("My name is Earl");
String str3 = new String("I love Java");
String str4 = new String("I live in Moscow");
LinkedList<String> earlBio = new LinkedList<>();
earlBio.add(str1);
earlBio.add(str3);
earlBio.add(1, str2);
earlBio.remove(1);
System.out.println(earlBio);
}
}
1-nji indeks bilen elementi pozsak (bu sanawyň ortasynda): Baglanyşyklary täzeden kesgitlänimizden soň, islenýän netijäni alarys: Öçürmekden tapawutlylykda, ArrayList
massiw elementleriniň üýtgemegi we şuňa meňzeşler ýok. str1
Diňe elementleriň we elementleriň salgylanmalaryny täzeden kesgitleýäris str3
. Indi biri-birine yşarat edýärler we obýekt str2
bu baglanyşyk zynjyryndan “çykdy” we indi sanawyň bir bölegi däl.
Usullara syn
UsullaryLinkedList
bilen köp meňzeşligi bar . Mysal üçin , ,,,, ( sanawdaky element), (çalyşmak bilen bir element goýmak) ýaly ArrayList
usullar iki synpda-da bar. (Mysalda bilşimiz ýaly we ) olaryň köpüsi içerde başgaça işleýärler, ýöne ahyrynda şol bir zady edýärler. Şeýle-de bolsa, sanawyň başy we soňy bilen işlemek üçin aýratyn usullary bar, olar ýok : add()
remove()
indexOf()
clear()
contains()
set()
size()
add()
remove()
LinkedList
ArrayList
addFirst()
,addLast()
: sanawyň başyna / soňuna element goşmagyň usullary
public class Car {
String model;
public Car(String model) {
this.model = model;
}
public static void main(String[] args) {
LinkedList<Car> cars = new LinkedList<>();
Car ferrari = new Car("Ferrari 360 Spider");
Car bugatti = new Car("Bugatti Veyron");
Car lambo = new Car("Lamborghini Diablo");
Car ford = new Car("Ford Mondeo");
Car fiat = new Car("Fiat Ducato");
cars.add(ferrari);
cars.add(bugatti);
cars.add(lambo);
System.out.println(cars);
cars.addFirst(ford);
cars.addLast(fiat);
System.out.println(cars);
}
@Override
public String toString() {
return "Car{" +
"model='" + model + '\'' +
'}';
}
}
Netije:
[Car{model='Ferrari 360 Spider'}, Car{model='Bugatti Veyron'}, Car{model='Lamborghini Diablo'}]
[Car{model='Ford Mondeo'}, Car{model='Ferrari 360 Spider'}, Car{model='Bugatti Veyron'}, Car{model='Lamborghini Diablo'}, Car{model='Fiat Ducato'}]
Netijede, Ford sanawyň başynda, ahyrynda bolsa Fiat boldy.
peekFirst()
,peekLast()
: sanawyň birinji / soňky elementini gaýtaryň.null
Sanaw boş bolsa gaýdyp gel .
public static void main(String[] args) {
LinkedList<Car> cars = new LinkedList<>();
Car ferrari = new Car("Ferrari 360 Spider");
Car bugatti = new Car("Bugatti Veyron");
Car lambo = new Car("Lamborghini Diablo");
cars.add(ferrari);
cars.add(bugatti);
cars.add(lambo);
System.out.println(cars.peekFirst());
System.out.println(cars.peekLast());
}
Netije:
Car{model='Ferrari 360 Spider'}
Car{model='Lamborghini Diablo'}
pollFirst()
,pollLast()
: sanawyň birinji / soňky elementini yzyna gaýtaryň we sanawdan aýyryň .null
Sanaw boş bolsa gaýdyp gel
public static void main(String[] args) {
LinkedList<Car> cars = new LinkedList<>();
Car ferrari = new Car("Ferrari 360 Spider");
Car bugatti = new Car("Bugatti Veyron");
Car lambo = new Car("Lamborghini Diablo");
cars.add(ferrari);
cars.add(bugatti);
cars.add(lambo);
System.out.println(cars.pollFirst());
System.out.println(cars.pollLast());
System.out.println("What's left on the list?");
System.out.println(cars);
}
Netije:
Car{model='Ferrari 360 Spider'}
Car{model='Lamborghini Diablo'}
What осталось в списке?
[Car{model='Bugatti Veyron'}]
toArray()
: sanaw elementleriniň toplumyny görkezýär
public static void main(String[] args) {
LinkedList<Car> cars = new LinkedList<>();
Car ferrari = new Car("Ferrari 360 Spider");
Car bugatti = new Car("Bugatti Veyron");
Car lambo = new Car("Lamborghini Diablo");
cars.add(ferrari);
cars.add(bugatti);
cars.add(lambo);
Car[] carsArray = cars.toArray(new Car[3]);
System.out.println(Arrays.toString(carsArray));
}
Netije:
[Car{model='Ferrari 360 Spider'}, Car{model='Bugatti Veyron'}, Car{model='Lamborghini Diablo'}]
LinkedList
Indi onuň nähili işleýändigini we nähili tapawutlanýandygyny bilýäris ArrayList
. Ony ulanmagyň peýdalary näme LinkedList
? Ilki bilen sanawyň ortasy bilen işlemekde . Ortada goýmak we pozmak LinkedList
öňküsinden has ýönekeý ArrayList
. Diňe goňşy elementleriň baglanyşyklaryny täzeden kesgitleýäris, gereksiz element bolsa baglanyşyk zynjyryndan “çykýar”. Bizde ArrayList
:
- ýeterlik ýeriň bardygyny barlaň (salýan wagtyňyz)
- ýeterlik bolmasa, täze bir massiw dörediň we maglumatlary şol ýere göçüriň (ýelmende)
- bir elementi poz / goý we beýleki elementleri sag / çepe geçir (işiň görnüşine baglylykda). Mundan başga-da, bu prosesiň çylşyrymlylygy sanawyň ululygyna baglydyr. 10 elementi göçürmek / göçürmek bir zat, ýöne million element bilen edil şonuň ýaly etmek düýbünden başga zat.
LinkedList
çalt bolmaly ArrayList
.
Teoriýa boýunça
public class Main {
public static void main(String[] args) {
List<Integer> list = new LinkedList<>();
for (int i = 0; i < 5_000_000; i++) {
list.add(new Integer(i));
}
long start=System.currentTimeMillis();
for(int i=0;i<100;i++){
list.add(2_000_000, new Integer(Integer.MAX_VALUE));
}
System.out.println("Time to run for LinkedList (in milliseconds) = " + (System.currentTimeMillis()-start));
}
}
Netije:
Время работы для LinkedList (в мorсекундах) = 1873
public class Main {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
for (int i = 0; i < 5_000_000; i++) {
list.add(new Integer(i));
}
long start=System.currentTimeMillis();
for (int i=0;i<100;i++){
list.add(2_000_000, new Integer(Integer.MAX_VALUE));
}
System.out.println("Time to run for ArrayList (in milliseconds) = " + (System.currentTimeMillis()-start));
}
}
Netije:
Время работы для ArrayList (в миллисекундах) = 181
Birden! LinkedList
Has täsirli bolmaly - sanawyň ortasyna 100 element girizip, has täsirli bolmaly bir operasiýa ýerine ýetirýän ýaly . Sanawymyz ullakan - 5000 000 element: ArrayList
her gezek salanymyzda iki million elementi üýtgetmeli bolduk! Victoryeňişiniň sebäbi näme? Ilki bilen, belli bir wagtyň içinde bir elemente girilýär . ArrayList
Görkezeniňizde:
list.add(2_000_000, new Integer(Integer.MAX_VALUE));
soň [2_000_000] ýagdaýynda ArrayList
bu ýatda belli bir salgy, sebäbi içinde bir massiw bar. Bu LinkedList
massiw ýok. Baglanyşyk zynjyry boýunça 2_000_000 element belgisini gözlär. Onuň üçin bu ýatda galan salgy däl, henizem ýetilmeli baglanyşyk:
fistElement.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next………
Netijede, sanawyň ortasyna her bir goýulma (pozulma) bilen, ArrayList
ýatda saklanmaly takyk adresi eýýäm bilýär, ýöne LinkedList
şonda-da gerekli ýere “gözlemeli”. IkinjidenArrayList
, mesele “özi” gurluşynda . Içerki massiwi giňeltmek, ähli elementleri göçürmek we üýtgeýän elementler ýörite içerki funksiýa bilen amala aşyrylýar - System.arrayCopy()
. Bu iş üçin ýörite optimallaşdyrylanlygy sebäpli gaty çalt işleýär. Desiredöne islenýän görkezijä “basmagyň” zerurlygy ýok ýagdaýlarda LinkedList
hakykatdanam özüni has gowy görkezýär. Mysal üçin, goýmak sanawyň başynda ýüze çyksa. Geliň, ol ýerde million elementi goýmaga synanyşalyň:
public class Main {
public static void main(String[] args) {
getTimeMsOfInsert(new ArrayList());
getTimeMsOfInsert(new LinkedList());
}
public static long getTimeMsOfInsert(List list) {
//write your code here
Date currentTime = new Date();
insert1000000(list);
Date newTime = new Date();
long msDelay = newTime.getTime() - currentTime.getTime(); //calculate the difference
System.out.println("Result in milliseconds: " + msDelay);
return msDelay;
}
public static void insert1000000(List list) {
for (int i = 0; i < 1000000; i++) {
list.add(0, new Object());
}
}
}
Netije:
Результат в миллисекундах: 43448
Результат в миллисекундах: 107
Doly başga netije! Sanawyň başyna million element girizmek üçin 43 sekuntdan gowrak wagt gerek boldy ArrayList
, LinkedList
ol bolsa 0,1 sekuntda tamamlandy! Bu ýagdaýda LinkedList
her gezek sanawyň ortasyna baglanyşyk zynjyryndan “ylgamak” hökman däldi. Sanawyň başynda derrew zerur görkezijini tapdy we operasiýa ýörelgeleriniň tapawudy eýýäm onuň tarapynda bolupdy :) Aslynda, " ArrayList
garşy LinkedList
" diskussiýa gaty giň ýaýrady we häzirki wagtda bu meselä çuňňur girmeris; derejesi. Rememberatda saklamaly esasy zat:
- Belli bir kolleksiýanyň “kagyz ýüzünde” artykmaçlyklary hakykatda işlemez (muňa sanawyň ortasyndan mysal alyp seretdik)
- Collectionygyndy saýlanyňyzda aşa aşa gitmeli dälsiňiz ("
ArrayList
elmydama has çalt, ulanyň we ýalňyşmarsyňyz.LinkedList
Hiç kim muny köp wagt bäri ulanmaýar").
LinkedList
Joşua Bloç hem şeýle diýýär :) Şeýle-de bolsa, bu nukdaýnazardan 100% dogry däl we biz muňa ynanýarys. Öňki mysalymyzda LinkedList
400 (!) Has çalt işledi. LinkedList
Anotherene bir zat, iň gowy saýlanjak ýagdaýlar hakykatdanam az . Theyöne olar bar we gerekli wagtda LinkedList
size çynlakaý kömek edip bilerler. Leksiýanyň başynda näme hakda gürleşendigimizi ýatdan çykarmaň: dürli maglumatlar gurluşlary dürli meseleler üçin has täsirli. Meseläniň ähli şertleri belli bolýança haýsy maglumat gurluşynyň has gowy boljakdygyny 100% ynam bilen aýtmak mümkin däl. Soň bu ýygyndylar hakda has köp maglumat alarsyňyz we saýlamak has aňsat bolar. Emma iň ýönekeý we iň täsirli wariant hemişe birmeňzeş: programmaňyzdaky hakyky maglumatlary synap görüň. Soňra iki sanawyň netijelerini öz gözüňiz bilen görüp bilersiňiz we hökman ýalňyşmarys :)
GO TO FULL VERSION