CodeGym /Kurslar /JAVA 25 SELF /List: ArrayList və LinkedList, əsas əməliyyatlar

List: ArrayList və LinkedList, əsas əməliyyatlar

JAVA 25 SELF
Səviyyə, Dərs
Mövcuddur

1. Sinif ArrayList

Java-da List interfeysi — bir müqavilədir: “Mən — elementlərin sıralanmış kolleksiyasıyam və məndən elementi nömrə (indeks) ilə almaq olar”.

Siyahının əsas xüsusiyyətləri (List):

  • Elementlər müəyyən bir qaydada saxlanılır (kümədən fərqli olaraq).
  • Təkrarlanan elementləri saxlamaq olar (məsələn: iki dəfə "Vasya").
  • Elementə indekslə müraciət etmək olar: birinci element — indeks 0, ikinci — 1 və sair.
  • Siyahının istənilən yerinə elementlər əlavə etmək və silmək olar.

List interfeysinin ən məşhur reallaşdırması — ArrayList-dir. Pərdə arxasında o, adi massivdən istifadə edir və məlumatlar artdıqca avtomatik genişlənir.

ArrayList necə yaradılır?

import java.util.ArrayList;
import java.util.List;

public class Example {
    public static void main(String[] args) {
        // Sətirlər siyahısını yaradırıq
        List<String> students = new ArrayList<>();
    }
}

İzah

  • List<String> — “sətirlər siyahısı” tipli dəyişəndir. Dəyişəni interfeys vasitəsilə elan edirik, obyekti isə konkret sinifdən (ArrayList) yaradırıq.
  • Kəskin mötərizələr <String> siyahının element tipini təyin edir (generiklər, generics).

ArrayList-in əsas metodları (və ümumiyyətlə istənilən List):

  • add(element) — elementi siyahının sonuna əlavə etmək.
  • add(index, element) — elementi konkret indeksə yerləşdirmək.
  • get(index) — elementi indekslə əldə etmək.
  • set(index, element) — elementi indeks üzrə əvəz etmək.
  • remove(index) — elementi indeks üzrə silmək.
  • remove(Object) — verilən obyektə bərabər olan ilk elementi silmək.
  • size() — siyahıdakı elementlərin sayını öyrənmək.

Nümunə: Tələbələr siyahısı ilə işləyirik

import java.util.ArrayList;
import java.util.List;

public class StudentListDemo {
    public static void main(String[] args) {
        List<String> students = new ArrayList<>();

        // Tələbələri əlavə edirik
        students.add("Vasya");
        students.add("Petya");
        students.add("Masha");

        // Bütün tələbələri çap edirik
        System.out.println("Tələbələr siyahısı: " + students);

        // Birinci tələbəni alırıq
        String first = students.get(0);
        System.out.println("Birinci tələbə: " + first);

        // İkinci tələbənin adını dəyişirik
        students.set(1, "Pavel");
        System.out.println("Dəyişiklikdən sonra: " + students);

        // Masha-nı silirik
        students.remove("Masha");
        System.out.println("Masha silindikdən sonra: " + students);

        // Siyahının ölçüsü
        System.out.println("Cəmi tələbə sayı: " + students.size());
    }
}

Nəticə:

Tələbələr siyahısı: [Vasya, Petya, Masha]
Birinci tələbə: Vasya
Dəyişiklikdən sonra: [Vasya, Pavel, Masha]
Masha silindikdən sonra: [Vasya, Pavel]
Cəmi tələbə sayı: 2

Bu bizim tətbiqlə necə əlaqəlidir?
Tutaq ki, tələbənin tapşırıqlarını uçota alan bir tətbiqimiz var. Artıq tapşırıqlar siyahısını List<String> kimi saxlaya və massivdən fərqli olaraq dinamik şəkildə yeni tapşırıqlar əlavə edə bilərik.

2. Sinif LinkedList: əlavə və silmənin sürəti vacib olanda

LinkedList — siyahının alternativ reallaşdırmasıdır. O, iki əlaqəli zəncir kimidir: hər düyün əvvəlki və sonrakı elementləri “bilir”. Qatar tərkibi kimi: “vaqonu” ortada yerləşdirmək sürətlidir və bütün tərkibi yenidən qurmağa ehtiyac yoxdur.

LinkedList yaratmaq

import java.util.LinkedList;
import java.util.List;

public class Example {
    public static void main(String[] args) {
        List<String> tasks = new LinkedList<>();
    }
}

LinkedList-in xüsusiyyətləri

  • Siyahının əvvəlində və ortasında sürətli əlavə və silmə.
  • İndeks üzrə ləng giriş (100-cü elementi tapmaq üçün zəncir üzrə keçmək lazımdır).
  • Yalnız sona deyil, həm də əvvələ və ortaya tez-tez əlavə/silmə edirsinizsə, uyğundur.

Nümunə: LinkedList-dən istifadə

import java.util.LinkedList;
import java.util.List;

public class TaskListDemo {
    public static void main(String[] args) {
        List<String> tasks = new LinkedList<>();

        tasks.add("Oyanmaq");
        tasks.add("Səhər yeməyi yemək");
        tasks.add("Dərslərə getmək");

        // Tapşırığı əvvələ əlavə edirik
        tasks.add(0, "Zəng quraşdırmaq");

        System.out.println("Tapşırıqlar siyahısı: " + tasks);

        // Birinci tapşırığı silirik (ən erkənini)
        tasks.remove(0);

        System.out.println("Birinci tapşırıq silindikdən sonra: " + tasks);
    }
}

3. ArrayList və LinkedList müqayisəsi

Meyar
ArrayList
LinkedList
Baza Massiv İkiyönlü siyahı
İndeks üzrə sürətli giriş Bəli (O(1)) Xeyr (O(n))
Əvvəldə/ortada sürətli əlavə/silmə Xeyr (O(n)) Bəli (O(1) — istinad olduqda)
Sonda sürətli əlavə/silmə Bəli (adətən O(1)) Bəli (O(1))
Yaddaş Daha az yaddaş sərf edir Daha çox (qonşulara əlavə istinadlar)
Tipik hallar İndeksə tez-tez giriş Tez-tez əlavə/silmə əməliyyatları

Sadə qayda:

  • İndeks üzrə sürətli giriş lazımdırsa — ArrayList istifadə edin.
  • Tez-tez əvvələ və ya ortaya əlavə/silmə edirsinizsə — LinkedList istifadə edin.

4. Siyahılarla tipik əməliyyatlar

Siyahının elementlərini dövr etmək

Adi for dövrü

for (int i = 0; i < students.size(); i++) {
    System.out.println("Tələbə #" + i + ": " + students.get(i));
}

for-each dövrü (ən populyar üsul)

for (String name : students) {
    System.out.println("Ad: " + name);
}

Lambda ifadəsi (Java 8+)

students.forEach(name -> System.out.println("Ad: " + name));

Elementlərin axtarışı

  • contains(element) — element siyahıda varsa, true qaytarır.
  • indexOf(element) — elementin ilk daxilolma indeksini qaytarır, tapılmasa -1.
if (students.contains("Vasya")) {
    System.out.println("Vasya siyahıda var!");
}
int index = students.indexOf("Vasya");
System.out.println("Vasya-nın indeksi: " + index);

Siyahının təmizlənməsi

clear() — bütün elementləri silir.

students.clear();
System.out.println("Təmizləmədən sonra siyahı: " + students);

5. Nə vaxt ArrayList, nə vaxt LinkedList istifadə etməli?

Belə düşünmək daha rahatdır: ArrayList elementlərə indekslə sürətli müraciət lazım olanda və siyahı tez-tez dəyişməyəndə yaxşıdır. Məsələn, uzun istifadəçi siyahısı və ya mesaj tarixçəsi — əsasən oxuma.

LinkedList isə əksinə, elementləri davamlı olaraq əvvələ/ortaya daxil edib siləndə faydalıdır. Bu, növbə, stek və ya əməliyyatların geri qaytarılması tarixçəsi ola bilər.

Praktikada ən çox ArrayList istifadə olunur. LinkedList isə “hər ehtimala qarşı alət” kimi qalır: çekməcədə durur, amma bəzən məhz lazım olan şey olur.

6. Siyahılarla işləyərkən tipik səhvlər

Səhv № 1: Siyahının hüdudlarından kənara çıxma. Ən çox rast gəlinən vəziyyət — mövcud olmayan indeksə müraciət. Siyahıda üç element varsa və siz students.get(5) yazırsınızsa, IndexOutOfBoundsException alacaqsınız. Girişdən əvvəl size() yoxlayın.

Səhv № 2: Dövr zamanı elementi silmək. for-each ilə dövr edib eyni zamanda elementləri sildikdə ConcurrentModificationException yaranacaq. Mürəkkəb silmələr üçün indeks üzrə dövr və ya Iterator istifadə edin.

Səhv № 3: Obyektlərin düzgün müqayisə edilməməsi. Öz obyektlərinizi saxlayırsınızsa (məsələn, Student), contains və remove metodları equals-a əsaslanır. Onu yenidən təyin etməsəniz, müqayisə məzmun üzrə deyil, istinad üzrə aparılacaq.

Səhv № 4: Xam tiplərdən istifadə. List list = new ArrayList() yazmayın — həmişə element tipini göstərin: List<String> list = new ArrayList<>(). Generiklər səhvlərdən qoruyur və kodu daha anlaşılan edir.

1
Tapşırıq
JAVA 25 SELF, səviyyə, dərs
Bağlanıb
Tələbənin cədvəli 🗓️✍️
Tələbənin cədvəli 🗓️✍️
1
Tapşırıq
JAVA 25 SELF, səviyyə, dərs
Bağlanıb
Mənim şəxsi film siyahım "Nə baxmalı" 🎬🍿
Mənim şəxsi film siyahım "Nə baxmalı" 🎬🍿
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION