Салом! Лекцияи имруза
ArrayList
, аз як тараф, назар ба лекцияхои пештара соддатар бошад, аз тарафи дигар, душвортар хохад буд. Ин мушкилтар аст, зеро имрӯз мо "дар зери кулоҳ" нигоҳ мекунем ArrayList
ва меомӯзем, ки ҳангоми амалиёт бо он чӣ рӯй медиҳад. Аз тарафи дигар, дар ин лекция кариб ягон code — асосан расмхо ва шарху эзохотхо вучуд нахоханд дошт. Пас, биёед меравем :) Тавре ки шумо аллакай медонед, дар дохor ArrayList
"a" массиви оддӣ мавҷуд аст, ки ҳамчун анбори додаҳо амал мекунад. Дар аксари мавридҳо, мо андозаи дақиқи рӯйхатро муайян намекунем. Аммо массиви дохилӣ бояд андоза дошта бошад! Ин дуруст аст. Андозаи пешфарзи он [10] аст .
public static void main(String[] args) {
ArrayList<Car> cars = new ArrayList<>();
}
Аввалан, биёед бубинем, ки илова кардани унсури нав чӣ гуна аст. Пеш аз ҳама, тафтиш карда мешавад , ки оё дар массиви дохилӣ фазои кофӣ вуҷуд дорад ва оё як элементи дигар мувофиқ аст. Агар фосила мавҷуд бошад, элементи нав ба охири рӯйхат илова карда мешавад. Вақте ки мо "то охир" мегӯем, мо ячейкаи охирини массивро дар назар намегирем (ин аҷиб мебуд). Ин ба чашмаки дар паҳлӯи элементи охирини ҷорӣ дахл дорад. Индекси он ба cars.size()
. Рӯйхати мо ҳоло холӣ аст ( cars.size() = 0
). Мутаносибан, элементи нав ба чашмак бо индекс илова карда мешавад 0
.
ArrayList<Car> cars = new ArrayList<>();
Car ferrari = new Car("Ferrari 360 Spider");
cars.add(ferrari);
Дар ин ҷо ҳама чиз равшан аст. Агар воридкунӣ дар мобайн, яъне байни якчанд элемент гузаронида шавад, чӣ мешавад?
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, которая уже занята
}
Боз ҳам, он аввал месанҷад, ки оё дар массив фазои кофӣ вуҷуд дорад. Агар фазои кофӣ мавҷуд бошад, элементҳо аз чашмаке, ки мо элементи навро мегузорем, ба тарафи рост гузаронида мешаванд. Мо ба ячейкаи дорои индекси 1 мегузорем. Яъне элементи аз ячейкаи 3 ба чашмаки 4, элементи 2 ба чашмаки 3, элементи 1 ба чашмаки 2 нусхабардорӣ карда мешавад. Баъд аз ин, элементи нави мо ба ҷои он часбонда мешавад. Элементи қаблӣ ( bugatti
) аллакай аз он ҷо ба макони нав нусхабардорӣ шудааст. Акнун биёед бифаҳмем, ки ин раванд чӣ гуна сурат мегирад, агар дар массив ҷой барои воридкунӣ вуҷуд надошта бошад. Аввалан, албатта, тафтиш карда мешавад, ки оё фазои кофӣ вуҷуд дорад. Агар маълум шавад, ки фазои кофӣ нест, ArrayList
дар дохor 'a массиви нави андоза (андозаи OldArray * 1.5) + 1 сохта мешавад.Дар ҳолати мо, массиви нав андозаи 16 ячейка дорад. Ҳама унсурҳои ҷорӣ фавран дар он ҷо нусхабардорӣ карда мешаванд. Массиви кӯҳна аз ҷониби коллектори партовҳо нест карда мешавад ва танҳо массиви нав ва васеъшуда боқӣ мемонад. Ҳоло барои элементи нав фазои холӣ мавҷуд аст. Мо онро ба ҳуҷайраи 3, ки ишғол аст, часбонем. Акнун тартиби шинос оғоз меёбад. Ҳама унсурҳое, ки аз индекси 3 сар мешаванд, як чашмак ба тарафи рост кӯчонида мешаванд ва элементи нав оромона илова карда мешавад. Ва ҳоло воридкунӣ муваффақ аст! Мо дохилкуниро тартиб додем. Акнун биёед дар бораи нест кардани элементҳо сӯҳбат кунем . Тавре ки шумо дар хотир доред, ҳангоми кор бо массивҳо мо ба мушкилот дучор шудем: вақте ки мо онҳоро нест кардем, дар он "сӯрохӣ" боқӣ монд. Ягона роҳи ҳал ин буд , ки элементҳо ҳар дафъае, ки онҳо нест карда мешуданд, ба чап кӯчонида шаванд ва шумо бояд codeи сменаро худатон нависед. ArrayList
аз руи хамин принцип кор мекунад, вале дар он ин механизм аллакай ба таври автоматй чорй карда мешавад. Чунин ба назар мерасад: Ва дар ниҳоят мо натиҷаи дилхоҳ мегирем: Элемент lambo
бомуваффақият нест карда шуд. Дар ин ҷо мо як хориҷ аз миёна кард. Равшан аст, ки нест кардан аз охири рӯйхат тезтар хоҳад буд, зеро элементи дилхоҳ бе иваз кардани ҳама дигарон хориҷ карда мешавад. Биёед бори дигар ба андозаи массиви дохилӣ ва нигоҳдории он дар хотира назар андозем. Тавсеаи массив равандест, ки миқдори муайяни захираҳоро мегирад. Аз ин рӯ, шумо набояд ArrayList
бо андозаи пешфарз эҷод накунед, агар шумо боварӣ дошта бошед, ки он ҳадди аққал 100 элемент дорад. То он даме, ки шумо ворид кардани элементи 100-умро мегиред, массиви дохилӣ 6 маротиба васеъ мешавад ва ҳар дафъа ҳамаи элементҳоро интиқол медиҳад.
- аз 10 элемент то 16
- аз 16 элемент то 25
- аз 25 то 38
- аз 38 то 58
- аз 58 то 88
- аз 88 то 133 (мувофиқи формула (андозаи массиви кӯҳна * 1.5) + 1)
ArrayList<Car> cars = new ArrayList<>(100);
Акнун массиви 100 элемент фавран дар хотира ҷудо карда мешавад, ки ин самараноктар хоҳад буд, зеро захираҳо ҳангоми васеъшавӣ беҳуда сарф намешаванд. Тарафи дигари танга низ мавчуд аст. Вақте ки an objectҳо аз массиви дохилӣ хориҷ карда мешаванд ArrayList
, андоза ба таври худкор кам намешавад. Масалан, мо ArrayList
массиви дохorи 88 элемент дорем, ки пурра пур шудааст: Дар давоми кори барнома мо 77 элементро аз он хориҷ мекунем ва дар он танҳо 11 элемент боқӣ мемонад: Оё шумо аллакай фаҳмидед, ки мушкилот чист? Истифодаи бесамар аз хотира, албатта! Мо танҳо 11 ячейка истифода мебарем, дар ҳоле ки хотираи мо барои 88 элемент ҷудо карда шудааст - ин нисбат ба мо 8 маротиба зиёдтар аст! Барои амалӣ намудани оптимизатсия дар ин ҳолат, шумо метавонед як усули махсуси синфро истифода баред ArrayList
- trimToSize()
. Он дарозии массиви дохorро ба миқдори элементҳои дар он нигоҳ дошташударо "бурида" мекунад. Акнун ба қадри зарурӣ хотира ҷудо карда мешавад! :)
GO TO FULL VERSION