Салом! Ҳама лексияҳои охирин ба омӯзиши рӯйхати ArrayList бахшида шудаанд . Ин сохтори додаҳо хеле қулай аст ва ба шумо имкон медиҳад, ки бисёр мушкилотро ҳал кунед. Бо вуҷуди ин, Java бисёр сохторҳои дигари маълумот дорад. Чаро? Пеш аз ҳама, зеро доираи вазифаҳои мавҷуда хеле васеъ аст ва барои вазифаҳои гуногун сохторҳои гуногуни додаҳо самараноктаранд . Имрӯз мо бо сохтори нав шинос мешавем - рӯйхати дукарата пайвандшуда LinkedList . Биёед бифаҳмем, ки он чӣ гуна кор мекунад, чаро онро дучандон пайваст меноманд ва чӣ гуна он аз ArrayList фарқ мекунад . Дар LinkedList, унсурҳо воқеан пайвандҳои занҷир мебошанд. Ҳар як элемент, ба ғайр аз маълумоте, ки дар он нигоҳ дошта мешавад, ба унсури қаблӣ ва оянда пайванд дорад . Ин пайвандҳо ба шумо имкон медиҳанд, ки аз як элемент ба элементи дигар гузаред. Он чунин сохта шудааст:
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);
}
}
Хулоса:
[Hello World! My name is Earl, I love Java, I live in Moscow]
Сохтори рӯйхати мо чунин хоҳад буд: Биёед бубинем, ки элементи нав чӣ гуна илова карда мешавад. Ин бо истифода аз add()
.
earlBio.add(str2);
Дар замони ин сатри code, рӯйхати мо аз як элемент иборат аст - string str1
. Биёед бубинем, ки минбаъд дар расм чӣ мешавад: Дар натиҷа str2
, ва str1
тавассути истинодҳои дар онҳо нигоҳ дошташуда пайваст шавед next
ва previous
: Акнун шумо бояд идеяи асосии рӯйхати дукарата алоқамандро дарк кунед. Элементҳо LinkedList
як рӯйхати ягона мебошанд, маҳз ба шарофати ин занҷири пайвандҳо. Дар дохor ягон массив LinkedList
, ба монанди дар ArrayList
, ё ягон чизи шабеҳ вуҷуд надорад. Ҳама корҳо бо ArrayList (ба андозаи калон) ба кор бо массиви дохилӣ рост меоянд. Ҳама корҳо бо LinkedList
тағир додани пайвандҳо анҷом дода мешаванд. Ин тавассути илова кардани элемент ба мобайни рӯйхат хеле равшан дида мешавад:
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);
}
}
Тавре ки шумо мебинед, усули изофабор add()
ба шумо имкон медиҳад, ки индекси мушаххасро барои элементи нав муайян кунед. str2
Дар ин ҳолат, мо мехоҳем, ки дар байни str1
ва як сатр илова кунем str3
. Ин аст он чизе ки дар дохor он рӯй медиҳад: Ва дар натиҷаи тағир додани истинодҳои дохилӣ, элемент str2
бомуваффақият ба рӯйхат илова карда мешавад: Ҳоло ҳама 3 элемент пайваст карда шудаанд. Аз унсури аввал дар баробари занҷир 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-ро нест кунем, чунин мешавад (он дар мобайни рӯйхат): Баъди аз нав муайян кардани пайвандҳо, мо натиҷаи дилхоҳ мегирем: Баръакси несткунӣ, ArrayList
ивазшавии элементҳои массив ва монанди инҳо вуҷуд надорад. Мо танҳо истинодҳои str1
ва унсурҳоро аз нав муайян мекунем str3
. Ҳоло онҳо ба ҳамдигар ишора мекунанд ва an object str2
аз ин занҷири пайвандҳо "баромадааст" ва дигар дар рӯйхат нест.
Баррасии усулҳо
Он бо усулҳоиLinkedList
бисёр монандӣ дорад . ArrayList
Масалан, усулҳо ба монанди add()
, remove()
, indexOf()
, clear()
, contains()
(элементест, ки дар рӯйхат мавҷуд аст), set()
(ворид кардани элемент бо иваз) size()
дар ҳарду синфҳо мавҷуданд. add()
Гарчанде ки (чунон ки мо дар мисол ва ) фаҳмидем remove()
, бисёре аз онҳо дар дохor худ ба таври гуногун кор мекунанд, аммо дар ниҳоят онҳо як корро мекунанд. Аммо, он LinkedList
дорои усулҳои алоҳидаи кор бо ибтидо ва охири рӯйхат мебошад, ки дар : мавҷуд нестанд ArrayList
:
addFirst()
,addLast()
: усулҳои илова кардани элемент ба аввал/охири рӯйхат
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 + '\'' +
'}';
}
}
Хулоса:
[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'}]
Дар натиҷа, Форд дар болои рӯйхат ва Fiat дар охири рӯйхат қарор гирифтанд.
peekFirst()
,peekLast()
: унсури якум/охирини рӯйхатро бармегардонад.null
Агар рӯйхат холӣ бошад, баргардед .
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());
}
Хулоса:
Car{model='Ferrari 360 Spider'}
Car{model='Lamborghini Diablo'}
pollFirst()
,pollLast()
: унсури якум/охирини рӯйхатро баргардонед ва онро аз рӯйхат хориҷ кунед .null
Агар рӯйхат холӣ бошад, баргардед
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);
}
Хулоса:
Car{model='Ferrari 360 Spider'}
Car{model='Lamborghini Diablo'}
What осталось в списке?
[Car{model='Bugatti Veyron'}]
toArray()
: массиви элементҳои рӯйхатро бармегардонад
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));
}
Хулоса:
[Car{model='Ferrari 360 Spider'}, Car{model='Bugatti Veyron'}, Car{model='Lamborghini Diablo'}]
Акнун мо медонем, ки он чӣ гуна кор мекунад LinkedList
ва чӣ гуна он аз ArrayList
. Манфиатҳои истифодаи он чӣ гунаанд LinkedList
? Пеш аз ҳама, дар кор бо миёнаи рӯйхат . Ворид кардан ва нест кардан дар мобайн LinkedList
нисбат ба ArrayList
. Мо танҳо пайвандҳои унсурҳои ҳамсояро аз нав муайян мекунем ва унсури нолозим аз занҷири пайвандҳо "афтад". Ҳангоми дар ArrayList
мо:
- санҷед, ки фазои кофӣ вуҷуд дорад (ҳангоми ворид кардан)
- агар ин кифоя набошад, массиви нав эҷод кунед ва маълумотро дар он ҷо нусхабардорӣ кунед (ҳангоми часпондан)
- нест кардан/ворид кардани элемент, ва кӯчонидани ҳамаи унсурҳои дигар ба рост/чап (вобаста ба намуди амалиёт). Илова бар ин, мураккабии ин раванд аз андозаи рӯйхат вобаста аст. Нусхабардорӣ/кӯчонидани 10 элемент як чиз аст, аммо бо як миллион элемент ин корро кардан тамоман дигар аст.
LinkedList
он бояд аз ArrayList
.
Дар назария
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));
}
}
Хулоса:
Время работы для 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));
}
}
Хулоса:
Время работы для ArrayList (в миллисекундах) = 181
Ногаҳон! Чунин ба назар мерасад, ки мо амалиётеро иҷро мекардем, ки LinkedList
бояд хеле самараноктар бошад - ворид кардани 100 элемент ба мобайни рӯйхат. Ва рӯйхати мо бузург аст - 5,000,000 элемент: ArrayList
мо маҷбур шудем, ки ҳар дафъае, ки онҳоро ворид кунем, якчанд миллион элементро иваз кунем! Сабаби галабаи у дар чист? Аввалан, ба элемент дар ArrayList
муддати муайян дастрас мешавад. Вақте ки шумо нишон медиҳед:
list.add(2_000_000, new Integer(Integer.MAX_VALUE));
пас дар мавриди ArrayList
[2_000_000] ин суроғаи мушаххас дар хотира аст, зеро он дар дохor он массив дорад. Дар ҳоле ки LinkedList
массив ин тавр намекунад. Он элементи рақами 2_000_000-ро дар баробари занҷири пайвандҳо ҷустуҷӯ мекунад. Барои ӯ, ин суроғаи хотиравӣ нест, балки истинодест, ки ҳоло ҳам бояд ба он расид:
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………
Дар натиҷа, бо ҳар як воридкунӣ (нест кардан) дар мобайни рӯйхат, ArrayList
он аллакай суроғаи дақиқро дар хотира медонад, ки бояд ба он дастрасӣ пайдо кунад, аммо LinkedList
ба ҳар ҳол лозим аст, ки ба ҷои лозима "пайдо" кунад. Сониян , масъала дар сохтори ArrayList
худи як аст. Васеъ кардани массиви дохилӣ, нусхабардории ҳама элементҳо ва иваз кардани элементҳо бо функсияи махсуси дохилӣ - System.arrayCopy()
. Он хеле зуд кор мекунад, зеро он махсус барои ин кор оптимизатсия шудааст. Аммо дар ҳолатҳое, ки лозим нест, ки ба индекси дилхоҳ "даста" кунед, LinkedList
он дар ҳақиқат худро беҳтар нишон медиҳад. Масалан, агар воридкунӣ дар аввали рӯйхат рух диҳад. Биёед кӯшиш кунем, ки ба он як миллион элемент ворид кунем:
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());
}
}
}
Хулоса:
Результат в миллисекундах: 43448
Результат в миллисекундах: 107
Натиҷаи тамоман дигар! Барои ворид кардани як миллион элемент ба аввали рӯйхат зиёда аз 43 сония вақт лозим буд ArrayList
, дар ҳоле ки LinkedList
он дар 0,1 сония анҷом ёфт! Махз аз он иборат буд, ки дар ин вазъият LinkedList
ба мо лозим набуд, ки хар дафъа аз занчири пайвандакхо ба мобайни руйхат «давем». Вай дар оғози рӯйхат дарҳол нишондиҳандаи лозимиро пайдо кард ва дар он ҷо фарқият дар принсипҳои кор аллакай дар паҳлӯи ӯ буд :) Дар ҳақиқат, баҳси " ArrayList
бар зидди LinkedList
" хеле васеъ паҳн шудааст ва мо дар айни замон ба он амиқ намеравем. сатҳи. Чизи асосие, ки шумо бояд дар хотир доред:
- На ҳама бартариҳои коллексияи мушаххаси "дар рӯи коғаз" дар асл кор хоҳанд кард (мо инро бо мисоли мобайни рӯйхат дида баромадем)
- Ҳангоми интихоби коллексия набояд ба ифротӣ равед (“
ArrayList
он ҳамеша тезтар аст, истифода баред ва хато намекунед.LinkedList
Ҳеҷ кас онро муддати тӯлонӣ истифода накардааст”).
LinkedList
Ҷошуа Блох чунин мегӯяд :) Аммо, ин нуқтаи назар аз 100% дуруст аст ва мо ба ин боварӣ дорем. Дар мисоли пешинаи мо LinkedList
он 400 (!) маротиба тезтар кор мекард. Чизи дигар ин аст, ки дар ҳақиқат кам ҳолатҳое ҳастанд, ки LinkedList
он интихоби беҳтарин аст. Аммо онҳо вуҷуд доранд ва дар вақти лозима LinkedList
онҳо метавонанд ба шумо ба таври ҷиддӣ кӯмак расонанд. Фаромӯш накунед, ки мо дар оғози лексия дар бораи он чӣ сӯҳбат кардем: сохторҳои гуногуни додаҳо барои вазифаҳои гуногун самараноктаранд. Бо боварии 100% гуфтан ғайриимкон аст, ки кадом сохтори додаҳо беҳтар хоҳад буд, то даме ки тамоми шароити мушкилот маълум шавад. Баъдтар шумо дар бораи ин коллексияҳо маълумоти бештар хоҳед гирифт ва интихоб кардан осонтар мешавад. Аммо соддатарин ва самараноктарин вариант ҳамеша як аст: ҳардуро дар бораи маълумоти воқеии барномаи шумо санҷед. Пас шумо метавонед бо чашмони худ натиҷаҳои ҳарду рӯйхатро бубинед ва шумо бешубҳа хато намекунед :)
GO TO FULL VERSION