Məzmuna keç
Educora
İrəli18 dəq11 / 18

Kolleksiyalar və generiklər

ArrayList, HashMap və HashSet ilə çevik verilənlər strukturlarından istifadə et və generiklərin tip təhlükəsizliyini necə təmin etdiyini öyrən.

Özünü yoxla
Bu dərsdə öyrənəcəksən
  • ArrayList ilə elementləri əlavə etmək, silmək, dəyişmək və sıralamaq
  • Açar–qiymət cütlərini HashMap-də, təkrarsız qiymətləri isə HashSet-də saxlamaq
  • List<String> kimi generik tipləri oxumaq və sadə generik sinif yazmaq

Massivin uzunluğu sabitdir: 5 yerlik massivə 6-cı elementi əlavə etmək olmur. Amma alış-veriş səbəti, çat mesajları, oyunçuların siyahısı daim böyüyür və kiçilir. Bunun üçün Java-da hazır kolleksiyalar var — java.util paketində yerləşən çevik verilənlər strukturları.

ArrayList: böyüyən siyahı

ArrayList massiv kimi indekslərlə işləyir, amma elementlər əlavə olunduqca özü böyüyür. Bucaq mötərizələrindəki <String> siyahıda hansı tipli elementlərin saxlanacağını göstərir. Dəyişəni adətən ümumi List interfeysi tipində elan edirlər, sağ tərəfdə isə tipi təkrarlamamaq üçün boş <> («almaz») yazılır.

Java
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<String> cities = new ArrayList<>();
        cities.add("Baku");
        cities.add("Ganja");
        cities.add("Lankaran");
        cities.add(1, "Shaki");
        System.out.println(cities + " size=" + cities.size());
        System.out.println(cities.get(0) + ", " + cities.contains("Ganja"));
        cities.remove("Lankaran");
        cities.set(0, "Sumgait");
        Collections.sort(cities);
        System.out.println(cities);
        for (String c : cities) {
            System.out.print(c.toUpperCase() + " ");
        }
        System.out.println();
    }
}
Gözlənilən nəticə
[Baku, Shaki, Ganja, Lankaran] size=4
Baku, true
[Ganja, Shaki, Sumgait]
GANJA SHAKI SUMGAIT 
MetodNə edir
add(x), add(i, x)sona və ya i mövqeyinə əlavə edir
get(i), set(i, x)i indeksli elementi oxuyur və ya əvəz edir
remove(i), remove(x)indeksə və ya qiymətə görə silir
size(), isEmpty()elementlərin sayı, siyahı boşdurmu
contains(x), indexOf(x)element varmı, harada yerləşir
İnteraktiv
Simulyasiya yüklənir…
list.contains(x) elementləri bir-bir yoxlayır — məhz bu xətti axtarış kimi. Siyahı böyüdükcə axtarış da uzanır. Tez-tez «bu element varmı?» sualını verirsənsə, aşağıdakı HashSet xeyli sürətlidir.

HashMap: açar və qiymət

Xəritə (Map) hər açarı bir qiymətlə əlaqələndirir — lüğət kimi: söz → izah, ölkə → paytaxt. Açarlar təkrarlanmır: eyni açarla yenidən put etsən, köhnə qiymət əvəz olunur. get açar tapılmasa null qaytarır, getOrDefault isə sənin verdiyin ehtiyat qiyməti.

Java
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;

public class Main {
    public static void main(String[] args) {
        Map<String, String> capitals = new HashMap<>();
        capitals.put("Azerbaijan", "Baku");
        capitals.put("Turkiye", "Ankara");
        capitals.put("Georgia", "Tbilisi");
        System.out.println(capitals.get("Turkiye"));
        System.out.println(capitals.get("France"));
        System.out.println(capitals.getOrDefault("France", "unknown"));
        System.out.println(capitals.containsKey("Georgia") + " " + capitals.size());

        String text = "to be or not to be";
        Map<String, Integer> counts = new TreeMap<>();
        for (String word : text.split(" ")) {
            counts.put(word, counts.getOrDefault(word, 0) + 1);
        }
        System.out.println(counts);
        for (Map.Entry<String, Integer> e : counts.entrySet()) {
            System.out.println(e.getKey() + " -> " + e.getValue());
        }
    }
}
Gözlənilən nəticə
Ankara
null
unknown
true 3
{be=2, not=1, or=1, to=2}
be -> 2
not -> 1
or -> 1
to -> 2

İkinci hissədə sözlərin sayını hesablayırıq: split(" ") mətni sözlərə bölür, hər söz üçün sayğac 1 artır. Burada TreeMap istifadə olunub — o da Map-dir, amma açarları əlifba sırası ilə saxlayır. HashMap isə elementləri sırasız saxlayır: o, daha sürətlidir, amma çap sırası əvvəlcədən məlum deyil. entrySet() isə bütün açar–qiymət cütlərini dövrlə gəzməyə imkan verir.

HashSet: təkrarsız elementlər

Çoxluq (Set) hər elementi yalnız bir dəfə saxlayır. add element əlavə olunanda true, artıq varsa false qaytarır. HashSet-də contains siyahıdakından qat-qat sürətlidir, çünki elementləri bir-bir yoxlamır, heş-kod vasitəsilə birbaşa lazımi yerə baxır.

Java
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;

public class Main {
    public static void main(String[] args) {
        List<String> visitors = List.of("Leyla", "Murad", "Leyla", "Aysel", "Murad");
        Set<String> unique = new HashSet<>(visitors);
        System.out.println(visitors.size() + " visits, " + unique.size() + " people");
        System.out.println(unique.add("Elvin") + " " + unique.add("Leyla"));
        System.out.println(unique.contains("Aysel"));
        System.out.println(new TreeSet<>(unique));
    }
}
Gözlənilən nəticə
5 visits, 3 people
true false
true
[Aysel, Elvin, Leyla, Murad]

Generiklər

List<String>, Map<String, Integer> — bu, generik (ümumiləşdirilmiş) tiplərdir. Onlar sayəsində kompilyator siyahıya səhv tipli element qoymağa imkan vermir və elementi götürəndə tipi çevirməyə ehtiyac qalmır. Kolleksiyalar yalnız obyektləri saxlayır, ona görə primitivlər əvəzinə örtük sinifləri yazılır: Integer, Double, Boolean, Character. Java int ↔ Integer çevirməsini avtomatik edir (autoboxing).

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

public class Main {
    static <T> T last(List<T> list) {
        return list.get(list.size() - 1);
    }

    public static void main(String[] args) {
        Pair<String, Integer> p = new Pair<>("Aysel", 95);
        System.out.println(p.first() + " scored " + p.second());
        List<Integer> nums = new ArrayList<>(List.of(10, 20, 30));
        int total = 0;
        for (int n : nums) {
            total += n;
        }
        System.out.println(total + " " + last(nums) + " " + last(List.of("a", "b")));
        nums.remove(1);
        System.out.println(nums);
        nums.remove(Integer.valueOf(10));
        System.out.println(nums);
    }
}

class Pair<A, B> {
    private final A first;
    private final B second;

    Pair(A first, B second) {
        this.first = first;
        this.second = second;
    }

    A first() { return first; }
    B second() { return second; }
}
Gözlənilən nəticə
Aysel scored 95
60 30 b
[10, 30]
[30]
  • class Pair<A, B> — generik sinif: A və B tip parametrləridir, obyekt yaradılanda konkret tiplərlə əvəz olunur.
  • static <T> T last(List<T> list) — generik metod: eyni kod həm Integer, həm də String siyahısı üçün işləyir.
  • List.of(...) bir sətirdə dəyişməz siyahı yaradır; onu dəyişmək lazımdırsa, new ArrayList<>(List.of(...)) yaz.

Əsas fikirlər

  • ArrayList ölçüsü dəyişən siyahıdır: add, get, set, remove, size.
  • HashMap açarı qiymətlə əlaqələndirir; açarlar təkrarlanmır, get tapmasa null qaytarır.
  • HashSet yalnız təkrarsız elementləri saxlayır və contains yoxlamasını çox sürətli edir.
  • HashMap və HashSet sıranı saxlamır; sıralı variantlar TreeMap və TreeSet-dir.
  • Generiklər (List<String>) tip təhlükəsizliyi verir; primitivlər əvəzinə Integer, Double kimi örtük sinifləri yazılır.

Özünü yoxla

10 sual. Hər düzgün cavab XP qazandırır.

1 / 10
ArrayList kimi kolleksiya massivdən nə ilə fərqlənir?