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 | |
|
|---|---|---|
| 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.
GO TO FULL VERSION