JavaRush /Java Blogu /Random-AZ /Java-da Dinamik Massivlər

Java-da Dinamik Massivlər

Qrupda dərc edilmişdir
Müxtəlif mürəkkəblik dərəcələrində proqramlar yaratarkən, hər bir tərtibatçı massivlər də daxil olmaqla bir çox məlumat növlərindən istifadə edir. Bu struktur bir növ dəsti saxlamaq üçün çox uyğundur, əla performans təmin edir və ümumiyyətlə rahatdır. Java-da Dinamik Massivlər - 1Massivlərin əhəmiyyətli çatışmazlığı onların statik olmasıdır: onların ölçüsü əvvəlcədən müəyyən edilməlidir. Bununla belə, proqramçılar hələ gələcəyi necə proqnozlaşdıracaqlarını bilmirlər (əlbəttə ki, məlumatı inanılmaz sürətlə emal edəcək və hər hansı hadisəni proqnozlaşdıra bilən süni intellekt ortaya çıxmasa). Bu səbəbdən proqram işləyərkən ölçüsünü dəyişə bilən struktur yaratdıq. Buna dinamik massiv deyilir .

JavaRush kursunda dinamik massivlər

Bu mövzu Java Sintaksis axtarışında JavaRush kursunun 7-ci və qismən 8-ci səviyyəsində çox başa düşülən və aydın şəkildə əhatə olunub . Bir neçə mühazirə və 18 problemin gedişində əsas məsələlər, dinamik massivlərin növləri və performans da daxil olmaqla, onlar arasındakı fərqlər əhatə olunur. Bu mövzu son dərəcə vacibdir, çünki dinamik massivlər tərtibatçını depressiyadan, baş ağrılarından azad edir və inanılmaz vaxta qənaət edir.

Dinamik massiv nədir?

Dinamik massiv proqramın icrası zamanı ölçüsünü dəyişə bilən massivdir. Java-da bu rolu əsasən ArrayList və LinkedList sinifləri oynayır. Massivlərdən fərqli olaraq, ArrayList və LinkedList yalnız istinad məlumat növlərini ehtiva edir, yəni onlar yalnız obyektləri saxlaya bilirlər. Xoşbəxtlikdən, Java-da primitiv tipləri dinamik massivlərdə saxlamağa imkan verən autoboxing və autounboxing mexanizmləri var. Statik massiv kimi, dinamik massiv də homojendir, yəni tək məlumat tipini saxlaya bilir. Bununla belə, irsiyyət mexanizmi və interfeyslərin düzgün istifadəsi sayəsində bir dinamik massivdə bir ümumi sinifdən miras qalan müxtəlif siniflərin bütün spektrini saxlamaq mümkündür, lakin aşağıda daha çox şey var. Yəni, statik massiv belə işləyir: Java-da dinamik massivJava-da Dinamik Massivlər - 2 isə aşağıdakı kimi işləyəcək (üçüncü addımdan diaqramı davam etdirərək): Java massivi köçürmək üçün xüsusi yerli funksiyadan istifadə edir, ona görə də belə “hərəkət” çox deyil. bahalı. Java-da Dinamik Massivlər - 3

Niyə bizə dinamik massiv lazımdır?

Java-da dinamik massiv proqramın yazıldığı anda ölçüsü məlum olmayan homojen verilənlər dəstlərini emal etmək üçün istifadə olunur. Məsələn, hazırda proqramdan istifadə edən hər bir müştərinin məlumatlarını keşləmək istəyə bilərsiniz. Belə müştərilərin sayını əvvəlcədən proqnozlaşdırmaq mümkün deyil. Dinamik massivlər olmadan bu problem aşağıdakı variantlarla həll edilə bilər:
  1. Ehtiyacın ödənilməsi ehtimalı 100% olan böyük massiv yaradın;
  2. Bufer rolunu oynayacaq statik massiv yaradın;
  3. Dəstlər kimi digər dinamik strukturları tətbiq edin.
Birinci seçim yalnız ciddi məhdud bir sıra olduqda uyğundur. Digər hallarda, belə bir massiv çox səmərəsiz olan çox miqdarda yaddaş sahəsi tutacaq. İkincisi, buferin təmizlənməsi, oxunması və s. üçün əlavə mexanikanın həyata keçirilməsini tələb edəcəkdir. Üçüncüsü də funksionallıqdakı fərqlərə görə çatışmazlıqlara malikdir.

Java-da dinamik massiv nə edir?

Java dilində ArrayList və LinkedList sinifləri dinamik massiv kimi çıxış edir. Ən çox istifadə edilən ArrayList-dir, çünki o, ikiqat əlaqəli siyahı konsepsiyasını həyata keçirən LinkedList-dən fərqli olaraq klassik massiv kimi çıxış edir. Bu barədə bir az sonra danışacağıq.

ArrayList, LinkedList - anlayışlar və əməliyyat qaydaları

ArrayList proqramın icrası zamanı genişləndirilə bilən klassik massivdir. O, adi massivə əsaslanır: yaradılarkən onun ölçüsü 10 elementdir. Ölçü artdıqca tutum da artır. ArrayList-in işlədiyi qaydalar:
  • Statik massiv kimi, o da 0-dan indekslənir;
  • Sonda daxiletmə və indeksə görə giriş çox sürətlidir - O(1);
  • Elementi başlanğıcda və ya ortada daxil etmək üçün bütün elementləri bir xana sağa köçürməli və sonra tələb olunan mövqeyə yeni element yapışdırmalısınız;
  • Dəyər üzrə giriş elementlərin sayından asılıdır - O(n);
  • Klassik massivdən fərqli olaraq o null saxlaya bilər;
LinkedList vəziyyətində hər şey bir az daha mürəkkəbdir: o, ikiqat əlaqəli siyahıya əsaslanır. Yəni struktur olaraq bu dinamik Java massivi bir-birinə istinad edən bir sıra dağınıq obyektlərdir. Şəkillərlə izah etmək daha asandır. HeadLinkedList-in içərisində elementlərin sayı haqqında məlumatı, həmçinin birinci və sonuncu elementlərə keçidi saxlayan əsas obyektimiz var : Динамические массивы в Java - 4İndi sahə size = 0, firstlast = null. Bu siyahıya əlavə edilən hər bir element ayrıca daxili obyektin məzmunudur. Bir element əlavə edək Johnny: Динамические массивы в Java - 5İndi "Johnny" dəyəri olan bir node var. Əsas element üçün birinci və sonuncu elementə olan bağlantılar yeni qovşağı göstərir. Bu obyekt həm də əvvəlki və sonrakı elementlərə keçidlərə malikdir. Əvvəlki ilə əlaqə həmişə null olacaq, çünki bu, birinci elementdir və növbəti birinə keçid həmişə null olacaq, çünki hələ mövcud deyil. Gəlin bunu düzəldək: Динамические массивы в Java - 6“Watson” dəyəri olan yeni bir element əlavə edildi, bu da ikinci oldu. Nəzərə alın ki, birinci elementin nextnövbəti elementə, yeni elementin isə previousəvvəlkinə işarə edən sahəsi var. Əsas element üçün sonuncu elementə keçid indi yeni qovşağı göstərir. Aşağıdakı diaqram siyahının ortasına elementlərin necə əlavə olunacağını göstərir: Динамические массивы в Java - 7Yeni element “Hamiş” əlavə edildi. Onu siyahının ortasına daxil etmək üçün şəkildə göstərildiyi kimi elementlərə keçidləri yenidən təyin etmək kifayətdir. Bu təsvirlər təfərrüata varmadan yuxarı səviyyədə ikiqat əlaqəli siyahı prosesini izah edir. LinkedList haqqında hekayəni ümumiləşdirmək üçün onun işləməsi üçün bir neçə qayda əldə edə bilərik:
  • Massiv kimi, o da 0-dan indekslənir;
  • Birinci və sonuncu elementə giriş elementlərin sayından asılı deyil - O(1);
  • Elementin indekslə alınması, siyahının ortasından daxil edilməsi və ya silinməsi elementlərin sayından asılıdır - O(n);
  • Siz iterator mexanizmindən istifadə edə bilərsiniz: sonra daxiletmə və silmə daimi vaxtda baş verəcək;
  • Klassik massivdən fərqli olaraq o null saxlaya bilər.

Kod nümunələri

Bəzi nümunələri nəzərdən keçirək. Kod parçalarına həm ArrayList, həm də LinkedList üçün nümunələr daxildir.

yaradılış

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

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

Bir elementin əlavə edilməsi

// Новый элемент добавляется в конец
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
İlk baxışda add()AND metodları addLast()eyni funksiyanı yerinə yetirir, lakin metod add()LinkedList-ə interfeysdən List, metod isə addLastinterfeysdən gəldi Deque. LinkedList bu interfeyslərin hər ikisini həyata keçirir. Bu vəziyyətdə yaxşı təcrübə kontekst üçün ən uyğun olan metoddan istifadə etmək olardı. Əgər LinkedList növbə kimi istifadə olunursa, onda ən yaxşısı addLast. Əgər LinkedList siyahı kimi istifadə edilərsə, istifadə etmək məqsədəuyğun olardı add().

Elementin çıxarılması

// Удаление 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);
Əgər obyekt indekslə silinirsə, metod silinmiş obyekti qaytarır. Əgər obyekt dəyərlə silinirsə (və ya LinkedList-in ilk və ya sonuncu elementləri silinirsə), obyekt tapılıb silinərsə, metod doğru , əks halda false qaytarır .

Elementə daxil olmaq və siyahıda axtarış etmək

// Доступ к элементу по индексу
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");

Bir döngədə gəzmək

// Использование обычного цикла
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);
}
Burada axtarış haqqında bir neçə söz deməyə dəyər. Bir çox təcrübəsiz tərtibatçılar, siyahıda bir element axtararkən, metodların mövcudluğuna baxmayaraq, bütün elementləri axtarılan elementlə müqayisə edərək, bir döngədə axtarışa indexOf()başlayırlar lastIndexOf(). contains()Bir elementin siyahıda olduğunu öyrənmək üçün metoddan da istifadə edə bilərsiniz :
boolean isContainsSherlock = arrayList.contains("Sherlock");
boolean isContainsPhp = linkedList.contains("Php");

Əlavə oxumaq üçün bağlantılar

  1. ArrayList-dən elementləri silmək haqqında əla məqalə var . Bunun dinamik Java massivi olduğuna görə elementləri silməkdə bir çox incəliklər var.
  2. ArrayList-in işi burada ətraflı təsvir edilmişdir .
  3. LinkedList haqqında bir az daha çox .
  4. ArrayListLinkedList haqqında Habr-dan bir neçə məqalə .
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION