CodeGym /Kurslar /JAVA 25 SELF /Java kolleksiyalarına icmal — kolleksiyalar nə üçün lazım...

Java kolleksiyalarına icmal — kolleksiyalar nə üçün lazımdır

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

1. Giriş

Vaxtilə biz artıq «sonsuz massivlər» — yəni siyahılarla tanış olmuşduq. Gəlin biliklərimizi dərinləşdirək və bunun üçün bir daha «klassik» massiv nədir sualını verək. Yaxşı baxsaq, o, sabit sayda bölməsi olan alət qutusuna bənzəyir. Tutaq ki, qutuda 10 bölmə var. 11-ci alət peyda oldu — indi nə? Yeni qutu almaq lazım gələcək! Elə ənənəvi massiv də sabit ölçülüdür və yaradıldıqdan sonra onun uzunluğu, necə varsa, elə də qalır.

Əgər element əlavə etmək və ya silmək lazımdırsa, yeni massiv yaratmalı və məlumatları əllə köçürməlisiniz. Massivdə elementi indeksə görə tapmaq asan və sürətlidir, amma elementin ortasına daxil etmək sadəcə «daxil etmək» deyil, «hamısını sağa sürüşdürmək» deməkdir, silərkən isə «hamısını sola sürüşdürmək» lazımdır. Bu, yavaşdır və əlverişli deyil. Bundan əlavə, massiv heç bir əlavə «məntiq» saxlamır: o sadəcə hüceyrələr toplusudur, çeşidləmə, məzmun üzrə axtarış və ya unikalığın yoxlanması isə kənar vasitələrlə həyata keçirilir.

Nümunə: tələbələrin dinamik siyahısı

Tutaq ki, siz qrupda tələbələrin uçotu üçün tətbiq yazırsınız. Əvvəlcə qrupda 5 nəfər var, sonra biri daha gəldi, sonra kimsə getdi. Massivlə bu belə görünərdi:

String[] students = new String[5];
students[0] = "İvan";
students[1] = "Mariya";
// və sair...

// Of, bir tələbə də gəldi
// Yeni massiv yaratmaq lazımdır!
String[] newStudents = new String[6];
for (int i = 0; i < students.length; i++) {
    newStudents[i] = students[i];
}
newStudents[5] = "Aleksey";
students = newStudents;

Rahatdır? Demək çətindir. Bəs belə əməliyyatlar çox olanda? Artıq daha rahat bir şey istəyirsən...

2. Kolleksiya nədir?

Kolleksiya — bu, digər obyektlərdən (elementlərdən) ibarət qrupu saxlamaq üçün konteyner rolunu oynayan obyektdir. Kolleksiyalar elementləri əlavə etməyə, silməyə, üzərindən keçməyə, həmçinin digər əməliyyatları — axtarış, çeşidləmə, filtrləmə və s. — yerinə yetirməyə imkan verir.

Java-da bütün kolleksiyalar Collection interfeysini reallaşdırır və ya ondan miras alır (və ya, əks etdirmələr üçün — Map-dən). Kolleksiya sadəcə «nəyinsə yığını» deyil, elementlərlə işləmək üçün düşünülmüş, əlverişli metodlar toplusu təqdim edən bir strukturdur.

Niyə kolleksiyalar obyektlərdir?

Çünki kolleksiyalar siniflər kimi reallaşdırılıb, yəni siz istənilən obyektlərin kolleksiyalarını yarada, onları kombinə edə, miras ala, genişləndirə və öz sinif və metodlarınızda istifadə edə bilərsiniz.

Nümunə:

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

List<String> students = new ArrayList<>();
students.add("İvan");
students.add("Mariya");
students.add("Aleksey");

Vuala! İndi massiv ölçüsü barədə düşünmədən istənilən sayda tələbə əlavə edə bilərsiniz.

3. Kolleksiyaların həll etdiyi tipik vəzifələr

Kolleksiyalar — məlumatla iş üçün İsveçrə bıçağı kimidir. Onlar aşağıdakı vəzifələri həll etməyə kömək edir:

  • Məlumatların dinamik siyahısını saxlamaq: Məsələn, tələbə siyahısı, planlaşdırıcıdakı tapşırıqlar, söhbətdəki mesajlar.
  • Axtarış və filtrləmə: Elementi tez tapmaq, onun mövcudluğunu yoxlamaq, müəyyən şərtə uyğun bütün elementləri əldə etmək.
  • Çeşidləmə: Elementləri lazım olan meyara görə asanlıqla çeşidləmək.
  • Elementlərin silinməsi və əlavə edilməsi: Massivləri əllə köçürməyə ehtiyac qalmadan istənilən yerdə elementləri daxil etmək və silmək.
  • Açar üzrə qruplaşdırma: Məsələn, hər ada uyğun telefon nömrəsi olan telefon kitabçası.
  • Unikallığın təminatı: Məsələn, mətndəki bütün unikal sözlər çoxluğu.

Nümunə: telefon kitabçası

Massivlə:

  • Adi necə ada görə nömrəni tapmaq olar? Massivi keçib adları müqayisə etmək lazım gələcək.
  • Yeni cütlük necə əlavə olunur? Massivi genişləndirmək lazım gələcək.
  • Adların təkrarlanmadığına necə zəmanət verilir? Daha da çətindir.

Kolleksiya ilə:

  • Map<String, String> istifadə edirik — və hər şey hazır işləyir.

4. Əsas kolleksiya növlərinə icmal

Java-da kolleksiyalar üç əsas qrupa bölünür:

Kolleksiya növü İnterfeys/Sinif Nə üçün istifadə olunur
Siyahı List, ArrayList Sıralı element toplusu, dublikatlara icazə verir, indeks üzrə giriş var
Kümə Set, HashSet Yalnız unikal elementləri saxlayır, sıra zəmanətli deyil
Xəritə Map, HashMap Açar-dəyər cütlərini saxlayır, açar üzrə sürətli axtarış

Siyahılar (List)

  • Sıralı kolleksiyalar, dublikatlara icazə verilir.
  • Elementi indeksə görə almaq mümkündür.
  • Nümunələr: ArrayList, LinkedList.

Kümələr (Set)

  • Yalnız unikal elementləri saxlayırlar.
  • İndeks üzrə giriş yoxdur.
  • Nümunələr: HashSet, TreeSet.

Xəritələr (Map)

  • Açar-dəyər cütlərini saxlayırlar.
  • Açar üzrə sürətli axtarış.
  • Nümunələr: HashMap, TreeMap.

Vizual sxem (çox şərti):

+------------------+       +-------------------+      +---------------------+
|     List         |       |        Set        |      |         Map         |
|------------------|       |-------------------|      |---------------------|
| [a, b, c, d, a]  |       | {a, b, c, d}      |      | {a=1, b=2, c=3}     |
| İndeksləmə: var  |       | İndeksləmə: yoxdur|      | Açar üzrə axtarış   |
| Dublikatlar: bəli|       | Dublikatlar: yoxdur|     | Açarlar unikaldır   |
+------------------+       +-------------------+      +---------------------+

5. Faydalı incəliklər

Hansı kolleksiyanı nə vaxt istifadə etməli?

List — elementlərin qaydası vacibdirsə, dublikatlar lazımdırsa, indeks üzrə giriş tələb olunursa (məsələn, tapşırıqlar siyahısı, mesajlar tarixi).

Set — yalnız unikal elementlər lazımdırsa, qayda vacib deyilsə (məsələn, unikal istifadəçilər çoxluğu).

Map — açarlarla dəyərləri əlaqələndirmək lazım olanda (məsələn, ad — açar, telefon — dəyər olan telefon kitabçası).

Həyatdan bənzətmələr

List — yeməkxanadakı növbə: əvvəl gələn — əvvəl xidmət alır; növbəyə bir neçə dəfə də qatıla bilərsən (dublikatlar).

Set — məclisdə qonaq siyahısı: hər qonaq yalnız bir dəfə (unikallıq).

Map — ünvan kitabçası: hər adın öz telefonu var.

Qısa yadda vərəqi: kolleksiyalar vs massivlər

Massiv (int[]) Kolleksiya (List<Integer>)
Ölçü Sabit Dinamik
Elementin əlavə edilməsi Əlverişsiz Asan: add()
Elementin silinməsi Əlverişsiz Asan: remove()
Dəyər üzrə axtarış Əllə ardıcıl keçmək Metodlar: contains() və s.
Çeşidləmə Arrays.sort() vasitəsilə Collections.sort() vasitəsilə, kolleksiya metodları
Unikallığın təminatı Yoxdur Set vasitəsilə
Açar-dəyər cütləri Yoxdur Map vasitəsilə

Kolleksiyaların OOP ilə əlaqəsi

Kolleksiyalar — müəyyən interfeysləri reallaşdıran obyektlərdir (List, Set, Map). Bu o deməkdir ki, siz:

  • Kolleksiyalarda istənilən obyektləri, o cümlədən öz siniflərinizin nümunələrini saxlaya bilərsiniz.
  • Kolleksiyaların kolleksiyalarını yarada bilərsiniz (məsələn, siyahıların siyahısı).
  • Kolleksiyalardan metodların parametrləri və qaytarılan dəyərləri kimi istifadə edə bilərsiniz.
  • Mirasalma və kompozisiya vasitəsilə kolleksiyaların funksionallığını genişləndirə bilərsiniz.

Nümunə: öz sinifinizin obyektlərindən ibarət kolleksiya

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

class Student {
    String name;
    int age;
    // Konstruktor, getter/setter-lər və s.
}

public class Main {
    public static void main(String[] args) {
        List<Student> group = new ArrayList<>();
        group.add(new Student("İvan", 20));
        group.add(new Student("Mariya", 21));
        // və sair...
    }
}

7. Kolleksiyalarla işləyərkən tipik səhvlər

Səhv №1: Tiplərsiz kolleksiyalardan istifadə (raw types).
Əgər siz ArrayList list = new ArrayList() yazırsınızsa, istənilən obyektin (məsələn, sətirlər və rəqəmlər qarışıq) əlavə edilməsi zamanı kompilyator irad tutmayacaq, lakin sonra elementi götürüb lazım olan tipə çevirməyə çalışarkən icra zamanı xətası (ClassCastException) ala bilərsiniz. Həmişə generics istifadə edin: ArrayList<String> list = new ArrayList<>().

Səhv №2: Lazım olan sinifi import etməmə.
Əgər «cannot find symbol» xətasını görürsünüzsə, faylın əvvəlində import java.util.ArrayList; sətrinin və ya sizin kolleksiyanız üçün lazım olan importun olduğunu yoxlayın.

Səhv №3: Kolleksiyalarla massivləri qarışdırmaq.
Kolleksiya — massiv deyil! Kolleksiyanın length sahəsi yoxdur, onun əvəzinə size() metodundan istifadə edin. Massivdə add() metodu yoxdur, kolleksiyada isə indeks üzrə giriş üçün [] operatoru yoxdur (yalnız siyahılarda get(index) ilə).

Səhv №4: Elementlərin qaydasının həmişə qorunacağını gözləmək.
Əgər siz Set və ya Map istifadə edirsinizsə, elementlərin qaydasına zəmanət verilmir (yalnız LinkedHashSet və ya TreeMap kimi xüsusi reallaşdırmalar istisnadır). Qaydalı məlumatlar üçün List və ya uyğun kolleksiyalardan istifadə edin.

Səhv №5: Kolleksiyalarda primitiv tiplərdən istifadə.
Kolleksiyalar yalnız obyektləri saxlaya bilər, primitivləri yox. Yəni List<int> yaratmaq olmaz, yalnız List<Integer>. Wrapper sinifləri unutmayın!

Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION