1. Collection interfeysi nədir
Java-da interfeys — sanki bir müqavilə kimidir: əgər sinif interfeysi reallaşdırırsa, onun bütün metodlarına reallaşdırma təqdim etməlidir. Interfeys özü-özlüyündə daxili vəziyyət saxlamır və kod ehtiva etmir (demək olar ki: Java 8-dən etibarən default metodlar mümkündür, amma indi əsas ideya önəmlidir).
Collection — Java-dakı kolleksiyaların çoxu üçün əsas interfeysdir. O, kolleksiyanın nə etməyi bacardığını müəyyənləşdirir: elementləri əlavə etmək, silmək, ölçüsünü öyrənmək, elementlərin mövcudluğunu yoxlamaq və s.
public interface Collection<E> extends Iterable<E> {
int size();
boolean isEmpty();
boolean contains(Object o);
boolean add(E e);
boolean remove(Object o);
void clear();
Iterator<E> iterator();
// ... və daha bir çox faydalı metodlar
}
Açar metodlar:
- add(E e) — element əlavə etmək.
- remove(Object o) — elementi silmək.
- size() — elementlərin sayını öyrənmək.
- isEmpty() — kolleksiyanın boş olub-olmadığını yoxlamaq.
- contains(Object o) — elementin mövcudluğunu yoxlamaq.
- clear() — kolleksiyanı təmizləmək.
- iterator() — dövr etmə üçün iterator almaq.
Niyə Map Collection-dan miras almır?
Map kolleksiyalar arasında ayrıca dayanır. Çünki Map — sadəcə elementlər toplusu deyil, “açar → dəyər” cütlükləri toplusudur. Onun fərqli müqaviləsi və metod dəsti var. Məsələn, Map-də add metodu yoxdur, çünki əlavə etmə put(key, value) vasitəsilə edilir və açarı bilmədən dəyərin olub-olmadığını yoxlamağın mənası yoxdur.
2. Kolleksiyaların iyerarxiyası
Əsas interfeyslərin zehni “ağacı” belə görünür:
Iterable
|
Collection
/ | \
List Set Queue
|
Deque
- Iterable — ən əsas interfeys: for-each döngüsündə dövr edilə bilən hər şey.
- Collection — Iterable-i genişləndirir, elementlər kolleksiyası ilə işləmə əməliyyatları əlavə edir.
- Üç əsas budaq:
- List — nizamlı siyahı, dublikatlara icazə verir.
- Set — unikal elementlər çoxluğu, sıra reallaşdırmadan asılıdır.
- Queue — növbə (adətən FIFO); alt növ — Deque (iki tərəfli növbə).
Və Map isə ayrıca yaşayır:
Map
/ \
HashMap TreeMap
İyerarxiyanın vizuallaşdırılması (sxem)
+--------------------+
| Iterable<E> |
+--------------------+
|
+--------------------+
| Collection<E> |
+--------------------+
/ | \
+--------+ +-------+ +-------+
| List | | Set | | Queue |
+--------+ +-------+ +-------+
|
+------+
|Deque |
+------+
+--------------------+
| Map<K,V> |
+--------------------+
3. List: dublikatları olan nizamlı kolleksiya
List — bu, aşağıdakı xüsusiyyətlərə malik kolleksiyadır:
- Elementlərin sırası vacibdir (birinci, ikinci, üçüncü…).
- Eyni elementlərə (dublikatlara) icazə verilir.
- Elementi indekslə almaq (list.get(2)), əvəzləmək, istənilən yerə daxil etmək olar.
Reallaşdırma nümunələri: ArrayList — indekslə sürətli çıxış; LinkedList — ortada tez-tez əlavə/silmə üçün uyğundur.
import java.util.*;
List<String> shoppingList = new ArrayList<>();
shoppingList.add("Süd");
shoppingList.add("Çörək");
shoppingList.add("Pendir");
shoppingList.add("Çörək"); // Dublikatlara icazə verilir!
System.out.println(shoppingList.get(1)); // "Çörək"
List-in tipik metodları:
- add(E e), add(int index, E e)
- get(int index), set(int index, E e)
- remove(int index), remove(Object o)
- indexOf(Object o), lastIndexOf(Object o)
4. Set: unikal elementlər çoxluğu
Set — bu, aşağıdakı xüsusiyyətlərə malik kolleksiyadır:
- Hər bir element unikal olmalıdır (dublikat yoxdur).
- HashSet-də saxlanma sırası zəmanətli deyil, TreeSet-də sıralama, LinkedHashSet-də isə əlavəetmə sırası ola bilər.
Reallaşdırma nümunələri: HashSet, TreeSet, LinkedHashSet.
import java.util.*;
Set<String> uniqueNames = new HashSet<>();
uniqueNames.add("Anya");
uniqueNames.add("Boris");
uniqueNames.add("Anya"); // Əlavə olunmayacaq — artıq var!
System.out.println(uniqueNames.contains("Anya")); // true
System.out.println(uniqueNames.size()); // 2
Set-in tipik metodları:
- add(E e), remove(Object o)
- contains(Object o)
- size(), isEmpty()
5. Map: açar-dəyər cütlükləri kolleksiyası
Map — bu, aşağıdakı xüsusiyyətlərə malik kolleksiyadır:
- Hər element — açar → dəyər cütüdür.
- Açarlar unikal olur, dəyərlər təkrarlana bilər.
- Açarla sürətli çıxış.
Reallaşdırma nümunələri: HashMap, TreeMap, LinkedHashMap.
import java.util.*;
Map<String, String> phoneBook = new HashMap<>();
phoneBook.put("Anya", "+19991112233");
phoneBook.put("Boris", "+19994445566");
phoneBook.put("Anya", "+19990001122"); // Anyanın nömrəsini yenidən yazacaq!
System.out.println(phoneBook.get("Anya")); // "+19990001122"
System.out.println(phoneBook.containsKey("Boris")); // true
Map-in tipik metodları:
- put(K key, V value), get(K key)
- remove(K key)
- containsKey(K key), containsValue(V value)
- keySet(), values(), entrySet()
6. İyerarxiyanın vizuallaşdırılması: hamısı bir şəkildə
Kiçik bir xülasə cədvəli:
| İnterfeys | Təsvir | Reallaşdırma nümunələri | Açar xüsusiyyətlər |
|---|---|---|---|
|
Nizamlı siyahı | |
İndekslə çıxış, dublikatlar |
|
Unikal elementlər toplusu | |
Yalnız unikal elementlər |
|
Açar-dəyər cütləri | |
Açarlar unikal, dəyərlər istənilən |
Sxemdə iyerarxiya:
Collection
/ | \
List Set Queue
|
Deque
Map (ayrıdır)
7. Hansı interfeysi nə vaxt istifadə etməli
List
- Elementlərin sırası vacib olduqda (məsələn, istifadəçi hərəkətlərinin tarixi).
- Dublikatlar lazım olduqda (məsələn, sifarişin maddələri).
- İndekslə sürətli çıxış/əvəzləmə lazım olduqda.
Set
- Unikallıq tələb olunduqda (email, loginlər, ID).
- Sıra vacib olmadıqda və ya əksinə — avtomatik sıralanan toplu lazım olduqda (TreeSet).
Map
- Açarları dəyərlərlə uyğunlaşdırmaq lazım olduqda (ID → obyekt, login → profil).
- Açar üzrə sürətli axtarış lazım olduqda.
- Açarlar unikal olmalı, dəyərlər isə olmaya da bilər.
8. Kolleksiya iyerarxiyası ilə işləyərkən tipik səhvlər
Səhv № 1: Dəyişən elanında yanlış interfeysdən istifadə. Əgər siz ArrayList<String> list = new ArrayList<>(); yazırsınızsa, reallaşdırmaya bərk bağlanırsınız. Daha məqsədəuyğun olanı List<String> list = new ArrayList<>(); — beləliklə reallaşdırmanı dəyişmək asandır.
Səhv № 2: Set-ə dublikat əlavə etməyə cəhd edib, onların görünəcəyini gözləmək. Bu, xəta deyil, xüsusiyyətdir: Set tərifcə dublikat saxlamır. Təkrar daxil etmə nəzərə alınmır.
Səhv № 3: Map-dən adi kolleksiya kimi istifadə. Map — nə siyahıdır, nə də çoxluq. Dövr etmək üçün keySet(), values() və ya entrySet() istifadə edin.
Səhv № 4: HashSet və ya HashMap-də sıra gözləmək. HashSet və HashMap sıralamaya zəmanət vermir. Sıra vacibdirsə — LinkedHashSet və ya LinkedHashMap götürün.
Səhv № 5: Unikal elementlər üçün List-dən istifadə. Unikallıq lazımdırsa — Set istifadə edin. List dublikatların qarşısını almır.
GO TO FULL VERSION