JavaRush /Блоги Java /Random-TG /Массивҳои динамикӣ дар Java

Массивҳои динамикӣ дар Java

Дар гурӯҳ нашр шудааст
Ҳангоми сохтани барномаҳои дараҷаи мураккабии гуногун, ҳар як таҳиякунанда намудҳои зиёди маълумот, аз ҷумла массивҳоро истифода мебарад. Ин сохтор барои нигоҳ доштани маҷмӯи як намуди хуб мувофиқ аст, иҷрои аълоро таъмин мекунад ва умуман қулай аст. Массивҳои динамикӣ дар Java - 1Камбудии назарраси массивҳо статикӣ будани онҳост: андозаи онҳо бояд пешакӣ муайян карда шавад. Бо вуҷуди ин, барномасозон ҳанӯз намедонанд, ки чӣ гуна ояндаро пешгӯӣ кунанд (агар, албатта, AI пайдо нашавад, ки иттилоотро бениҳоят зуд коркард мекунад ва ҳама гуна ҳодисаҳоро пешгӯӣ карда метавонад). Аз ин сабаб, мо сохторе сохтем, ки метавонад андозаи онро ҳангоми иҷрои барнома тағир диҳад. Он массиви динамикӣ номида мешавад .

Массивҳои динамикӣ дар курси JavaRush

Ин мавзӯъ дар сатҳи 7 ва қисман дар сатҳи 8 курси JavaRush дар ҷустуҷӯи Java Syntax хеле фаҳмо ва равшан фаро гирифта шудааст . Дар давоми якчанд лексияҳо ва то 18 масъала, масъалаҳои асосӣ, намудҳои массивҳои динамикӣ ва фарқияти байни онҳо, аз ҷумла иҷроиш баррасӣ карда мешаванд. Ин мавзӯъ бениҳоят муҳим аст, зеро массивҳои динамикӣ таҳиягари депрессия, дарди сарро сабук мекунанд ва миқдори бениҳоят вақтро сарфа мекунанд.

Массиви динамикӣ чист?

Массиви динамикӣ массивест , ки ҳангоми иҷрои барнома андозаи худро тағир дода метавонад. Дар Java ин нақшро асосан синфҳои ArrayList ва LinkedList иҷро мекунанд. Баръакси массивҳо, ArrayList ва LinkedList танҳо намудҳои маълумотро дар бар мегиранд, яъне онҳо метавонанд танҳо an objectҳоро нигоҳ доранд. Хушбахтона, Java дорои механизмҳои autoboxing ва autounboxing мебошад, ки ба шумо имкон медиҳад намудҳои ибтидоиро дар массивҳои динамикӣ нигоҳ доред. Мисли массиви статикӣ, массиви динамикӣ якхела аст, яъне он метавонад як навъи маълумотро нигоҳ дорад. Аммо, ба шарофати механизми мерос ва истифодаи дурусти интерфейсҳо мумкин аст, ки дар як массиви динамикӣ маҷмӯи пурраи синфҳои гуногунро, ки аз як синфҳои умумӣ мерос гирифтаанд, нигоҳ доштан мумкин аст, аммо бештар дар бораи он. Яъне массиви статикӣ чунин кор мекунад: Массивҳои динамикӣ дар Java - 2Ва массиви динамикӣ дар Java чунин кор хоҳад кард (дар идомаи диаграмма аз қадами сеюм): Массивҳои динамикӣ дар Java - 3Java барои нусхабардории массив аз функсияи махсуси модарӣ истифода мебарад , бинобар ин чунин "ҳаракат" чандон нест. қимат.

Чаро ба мо массиви динамикӣ лозим аст?

Массиви динамикӣ дар Java барои коркарди маҷмӯи додаҳои якхела истифода мешавад, ки андозаи онҳо дар вақти навиштани барнома маълум нест. Масалан, шумо метавонед маълумоти ҳар як муштариро, ки айни замон барномаро истифода мебарад, кэш кунед. Шумораи чунин мизочонро пешакй пешгуй кардан мумкин нест. Бе массивҳои динамикӣ, ин мушкилотро бо имконоти зерин ҳал кардан мумкин аст:
  1. Массиви калонеро эҷод кунед, ки 100% эҳтимолияти эҳтиёҷотро пӯшонад;
  2. Массиви статикӣ эҷод кунед, ки ҳамчун буфер амал мекунад;
  3. Дигар сохторҳои динамикӣ, ба монанди маҷмӯаро истифода баред.
Варианти аввал танҳо дар сурати маҳдуд будани доираи маҳдуд мувофиқ аст. Дар ҳолатҳои дигар, чунин массив миқдори зиёди фазои хотираро ишғол мекунад, ки ниҳоят бесамар аст. Дуюм ба амал баровардани механикаи иловагиро барои тоза кардани буфер, хондан ва гайра талаб мекунад. Сеюм инчунин аз сабаби тафовут дар функсия нуқсонҳо дорад.

Массиви динамикӣ дар Java чӣ кор мекунад?

Дар забони Java синфҳои ArrayList ва LinkedList ҳамчун массиви динамикӣ амал мекунанд. Аз ҳама бештар истифодашаванда ArrayList аст, зеро он ҳамчун массиви классикӣ амал мекунад, бар хилофи LinkedList, ки консепсияи рӯйхати дукарата алоқамандро амалӣ мекунад. Мо дар ин бора каме дертар гап мезанем.

ArrayList, LinkedList - консепсияҳо ва қоидаҳои амалиётӣ

ArrayList як массиви классикист, ки онро ҳангоми иҷрои барнома васеъ кардан мумкин аст. Он ба массиви муқаррарӣ асос ёфтааст: андозаи он ҳангоми сохтани он 10 элемент аст. Бо зиёд шудани андоза, иқтидор зиёд мешавад. Қоидаҳое, ки аз рӯи он ArrayList кор мекунад:
  • Мисли массиви статикӣ, он аз 0 индексатсия карда мешавад;
  • Воридшавӣ дар охири ва дастрасӣ аз рӯи индекс хеле зуд аст - O(1);
  • Барои ворид кардани элемент дар аввал ё мобайн, шумо бояд ҳамаи элементҳоро як чашмак ба тарафи рост нусхабардорӣ кунед ва дар ҷои зарурӣ элементи навро часбонед;
  • Дастрасӣ аз рӯи арзиш аз шумораи элементҳо вобаста аст - O(n);
  • Баръакси массиви классикӣ, он метавонад null нигоҳ дорад;
Дар мавриди LinkedList, ҳама чиз каме мураккабтар аст: он ба рӯйхати дукарата алоқаманд асос ёфтааст. Яъне, аз ҷиҳати сохторӣ, ин массиви динамикии Java як қатор an objectҳои парокандаест, ки ба ҳамдигар ишора мекунанд. Бо тасвирҳо шарҳ додан осонтар аст. Дар дохor LinkedList мо an objectи асосӣ дорем Head, ки дар он маълумот дар бораи шумораи элементҳо, инчунин пайванд ба унсурҳои аввал ва охирин нигоҳ дошта мешавад: Динамические массивы в Java - 4Ҳоло майдон size = 0, firstва аст last = null. Ҳар як элементе, ки ба ин рӯйхат илова карда мешавад, мундариҷаи an objectи дохorи алоҳида мебошад. Биёед як элементро илова кунем Johnny: Динамические массивы в Java - 5Ҳоло мо гиреҳ дорем, ки арзиши "Ҷонни" дорад. Барои унсури асосӣ, пайвандҳо ба унсури якум ва охирин ба гиреҳи нав ишора мекунанд. Ин an object инчунин ба унсурҳои қаблӣ ва оянда пайванд дорад. Истиноди қаблӣ ҳамеша сифр хоҳад буд, зеро ин унсури аввал аст ва пайванд ба дигараш ҳамеша сифр хоҳад буд, зеро он ҳанӯз вуҷуд надорад. Биёед инро ислоҳ кунем: Динамические массивы в Java - 6Як унсури нав бо арзиши "Уотсон" илова карда шуд, ки дуюмаш шуд. Лутфан таваҷҷӯҳ намоед, ки унсури аввал майдоне дорад next, ки ба унсури оянда ишора мекунад ва унсури нав майдоне дорад previous, ки ба пешина ишора мекунад. Барои унсури асосӣ, пайванд ба унсури охирин ҳоло ба гиреҳи нав ишора мекунад. Диаграммаи зерин нишон медиҳад, ки чӣ тавр ба мобайни рӯйхат элементҳо илова кардан мумкин аст: Динамические массивы в Java - 7Элементи нави "Ҳамиш" илова карда шуд. Барои ворид кардани он ба мобайни рӯйхат, танҳо истинодҳоро ба элементҳо, тавре ки дар расм нишон дода шудааст, аз нав таъин кунед. Ин тасвирҳо раванди рӯйхати дукарата алоқамандро дар сатҳи боло бидуни тафсилот шарҳ медиҳанд. Барои ҷамъбасти ҳикоя дар бораи LinkedList, мо метавонем якчанд қоидаҳои кори онро ба даст орем:
  • Мисли массив, он аз 0 индексатсия карда мешавад;
  • Дастрасӣ ба элементи якум ва охирин аз шумораи элементҳо вобаста нест - O(1);
  • Гирифтани элемент аз рӯи индекс, дохил кардан ё нест кардани мобайни рӯйхат аз шумораи элементҳо вобаста аст - O(n);
  • Шумо метавонед механизми итераторро истифода баред: он гоҳ воридкунӣ ва несткунӣ дар вақти доимӣ сурат мегирад;
  • Баръакси массиви классикӣ, он метавонад нулро нигоҳ дорад.

Намунаҳои code

Биёед якчанд мисолҳоро дида бароем. Парчаҳои code намунаҳоро барои ArrayList ва LinkedList дар бар мегиранд.

Эҷод

// Создаем новый список
ArrayList<String> arrayList = new ArrayList<>();
// Создается новый список и указывается начальный размер внутреннего массива
ArrayList<String> arrayListLarge = new ArrayList<>(100000);

// Создаем новый LinkedList
LinkedList<String> linkedList = new LinkedList<>();

Илова кардани элемент

// Новый элемент добавляется в конец
arrayList.add("Johhny");
// Новый элемент добавляется в указанную позицию (в данном случае — в начало)
arrayList.add(0, "Watson");

// Новый элемент добавляется в конец двусвязного списка
linkedList.add("Java");
// Новый элемент добавляется в нулевую позицию списка:
linkedList.addFirst("I think");
// Новый элемент добавляется в конец списка
linkedList.addLast("language");
// Новый элемент добавляется в указанную позицию
linkedList.add(2, "is a terrific");

// Получение размера списков
int arraySize = arrayList.size(); // 2
int linkedSize = linkedList.size(); // 4
Дар назари аввал, усулҳои add()AND addLast()як функсияро иҷро мекунанд, аммо усул add()ба LinkedList аз интерфейс Listва усул addLastаз интерфейс омадааст Deque. LinkedList ҳардуи ин интерфейсҳоро амалӣ мекунад. Таҷрибаи хуб дар ин ҳолат истифодаи усуле мебошад, ки барои контекст мувофиқтар аст. Агар LinkedList ҳамчун навбат истифода шавад, беҳтар аст, ки addLast. Агар LinkedList ҳамчун рӯйхат истифода шавад, истифодаи он мувофиқ аст add().

Хориҷ кардани элемент

// Удаление element по индексу
arrayList.remove(0);
// Удаление element по значению
arrayList.remove("Johnny");

// Удаление первого element в списке
linkedList.removeFirst();
// Удаление первого element в списке, фактически вызов предыдущего метода
linkedList.remove();
// Удаление последнего element в списке
linkedList.removeLast();
// Удаление первого вхождения element в список
linkedList.removeFirstOccurrence("language");
// Удаление последнего вхождения element в список
linkedList.removeLastOccurrence("Java");
// Удаление по индексу
linkedList.remove(2);
Агар an object аз рӯи индекс нест карда шавад, усул an objectи ҳазфшударо бармегардонад. Агар an object аз рӯи арзиш нест карда шавад (ё унсурҳои аввал ё охирини LinkedList нест карда шаванд), усул агар an object пайдо ва нест карда шавад, ҳақиқиро бармегардонад , дар акси ҳол.

Дастрасӣ ба ашё ва ҷустуҷӯи рӯйхат

// Доступ к элементу по индексу
String arrayElement = arrayList.get(2);
// Поиск element по значению
int arrayIndex = arrayList.indexOf("Watson");
// Поиск последнего индекса вхождения element в список
int lastArrayIndex = arrayList.lastIndexOf("Watson");

// Доступ по индексу
String linkedElement = linkedList.get(3);
// Получение первого element
String firstLinkedElement = linkedList.getFirst();
// Получение последнего element
String lastLinkedElement = linkedList.getLast();

// Поиск element по значению
int linkedIndex = linkedList.indexOf("Java");
// Поиск последнего индекса вхождения element в список
int lastLinkedIndex = linkedList.lastIndexOf("Java");

Дар як ҳалқа қадам задан

// Использование обычного цикла
for(int i = 0; i<arrayList.size(); i++) {
  String value = arrayList.get(i);
  System.out.println(value);
}

for(int i = 0; i<linkedList.size(); i++) {
  String value = linkedList.get(i);
  System.out.println(value);
}

// Использование цикла for-each
for(String s : arrayList) {
  System.out.println(s);
}

for(String s : linkedList) {
  System.out.println(s);
}
Дар ин ҷо меарзад чанд сухан дар бораи ҷустуҷӯ. Бисёре аз таҳиягарони навкор, ҳангоми ҷустуҷӯи элемент дар рӯйхат, сарфи назар аз мавҷудияти усулҳо indexOf()ва lastIndexOf(). Шумо инчунин метавонед ин усулро contains()барои дарёфти далели мавҷуд будани элемент дар рӯйхат истифода баред:
boolean isContainsSherlock = arrayList.contains("Sherlock");
boolean isContainsPhp = linkedList.contains("Php");

Истинодҳо барои хондани минбаъда

  1. Дар ин ҷо мақолаи олӣ дар бораи нест кардани унсурҳо аз ArrayList мавҷуд аст. Аз сабаби он, ки ин массиви динамикии Java аст , дар хориҷ кардани унсурҳо нозукиҳои зиёде мавҷуданд.
  2. Корҳои ArrayList дар ин ҷо ба таври муфассал тасвир шудаанд .
  3. Як каме бештар дар бораи LinkedList.
  4. Якчанд мақолаҳо аз Habr дар бораи ArrayList ва LinkedList .
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION