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