1. Giriş
Biz artıq bilirik ki, ArrayList — öz-özünə böyüyən «sonsuz massiv» kimidir. Amma onun bir məhdudiyyəti var: elementlərə müraciət nömrə (indeks) üzrə aparılır. Əgər bizdə min nəfərlik siyahı varsa və Alisanın telefonunu tapmaq istəyiriksə, ya onun indeksini bilməliyik, ya da hamını ardıcıl gəzməliyik.
Həyatda isə məlumatları çox vaxt unikal əlamətə görə axtarırıq:
- ada görə telefon nömrəsini axtarırıq,
- pasport nömrəsinə görə sahibini tapırıq,
- loginə görə parolu tapırıq,
- id-ə görə bazada obyekt axtarırıq.
Bunun üçün belə bir struktur lazımdır: «açarı aldım → dərhal dəyəri tapdım». Java-da bunu HashMap<K,V> edir.
Analoqiya:
Adi kağız lüğəti təsəvvür edin. Siz «house» sözünün tərcüməsini axtarırsınız. Bütün səhifələri ard-arda çevirməyə ehtiyac yoxdur. Dərhal «H» hərfinə gedib lazım olan sözü tapırsınız. HashMap də belə işləyir: açara (sözə) görə dəyəri (tərcüməni) dərhal alırıq.
Lüğətin yaradılması
Lüğət yaratmaq üçün hansı tiplərin açar, hansılarının isə dəyər olacağını göstərmək lazımdır.
import java.util.HashMap;
HashMap<String, String> phonebook = new HashMap<String, String>();
Burada:
- String (birinci tip) — açarın tipi (insanın adı).
- String (ikinci tip) — dəyərin tipi (telefon nömrəsi).
İndi phonebook — sanki həqiqi telefon kitabçasıdır.
Başqa variantlara nümunələr:
HashMap<String, Integer> grades = new HashMap<String, Integer>(); // ad → qiymət
HashMap<Integer, String> users = new HashMap<Integer, String>(); // id → ad
HashMap<String, Boolean> flags = new HashMap<String, Boolean>(); // açar → məntiqi dəyər
ArrayList-dən fərqli olaraq, lüğətdə add() metodu yoxdur, amma öz maraqlı metodları var.
2. Metod put(key, value) — cüt əlavə etmək
HashMap-in massivlərdən və siyahılardan əsas fərqi ondadır ki, o, sadəcə dəyərlər toplusunu deyil, açar–dəyər cütlərini saxlayır. Bu onu əsl lüğətə bənzədir: hər sözün tərcüməsi, hər adın — telefonu, hər loginin — parolu var.
Nümunə:
phonebook.put("Alisa", "+380501112233");
phonebook.put("Bob", "+380671234567");
İndi bizim telefon kitabçamızda:
- "Alisa" açarı "+10501112233" dəyəri ilə əlaqələndirilib,
- "Bob" açarı "+10671234567" dəyəri ilə əlaqələndirilib.
Bu o deməkdir ki, dəyəri (telefonu) almaq üçün açarı (adı) bilmək kifayətdir.
Vacibdir: açarlar unikaldır. Əgər mövcud açarla yeni dəyər əlavə etməyə çalışsaq, köhnə dəyər üzərinə yazılacaq.
phonebook.put("Alisa", "+10999999999");
İndi Alisanın yalnız yeni nömrəsi qaldı: köhnə nömrə itdi.
Nəticə: put — qeydləri əlavə etmək və ya yeniləmək üçündür. Açar yenidirsə — qeyd yaradılır. Açar artıq varsa — qeyd yenilənir.
3. Metod get(key) — dəyəri almaq
Dəyəri tapmaq üçün açarı bilmək lazımdır. Bu, HashMap-in əsas üstünlüyüdür: açar üzrə axtarış çox sürətlidir, demək olar ani olur — istər min, istərsə də milyon qeyd olsun.
Nümunə:
System.out.println(phonebook.get("Alisa"));
Çıxış:
+10501112233
Belə açar yoxdursa, get null qaytaracaq:
System.out.println(phonebook.get("Charli")); // null
Bu o deməkdir: «lüğətdə "Charli" açarı yoxdur».
4. Metod containsKey(key) — mövcudluğu yoxlamaq
null-a rast gəlməmək üçün əvvəlcə açarın lüğətdə olub-olmadığını yoxlamaq faydalıdır.
Nümunə:
System.out.println(phonebook.containsKey("Charli"));
Çıxış:
false
Beləcə, öncədən başa düşə bilərik:
- açar yoxdursa — yeni qeyd yaradırıq,
- açar varsa — onu yeniləyirik.
Tez-tez istifadə olunan üsul:
if (phonebook.containsKey("Alisa"))
{
System.out.println("Alisanın artıq nömrəsi var!");
}
else
{
phonebook.put("Alisa", "+10111111111");
}
5. Metod remove(key) — qeydi silmək
Silmək də eyni dərəcədə sadədir: yalnız açarı bilmək kifayətdir.
phonebook.remove("Bob");
System.out.println(phonebook.get("Bob"));
Çıxış:
null
Artıq "Bob" açarlı qeyd lüğətdə yoxdur.
6. Bütün cütləri iterasiya etmək
Çox vaxt təkcə konkret açar üzrə dəyəri almaq deyil, bütün lüğəti tam çıxarmaq da lazım olur. Bunun üçün entrySet() metodu istifadə olunur.
for (var entry : phonebook.entrySet()) {
System.out.println(entry.getKey() + " -> " + entry.getValue());
}
Nümunə çıxışı:
Alisa -> +10501112233
Beləliklə, biz həm açara (entry.getKey()), həm də dəyərə (entry.getValue()) dərhal çıxış əldə edirik.
7. Təcrübə: sözlərin sayılması
Klassik bir tapşırıqa baxaq — mətndə sözlərin təkrar sayını hesablamaq. Bu, HashMap-in ümumiyyətlə nə üçün lazım olduğunun ən parlaq nümunələrindən biridir.
String text = "java java core java";
HashMap<String, Integer> freq = new HashMap<String, Integer>();
for (String w : text.split(" "))
{
Integer old = freq.get(w);
freq.put(w, (old == null) ? 1 : old + 1);
}
System.out.println(freq);
Çıxış:
{core=1, java=3}
Gəlin detallı baxaq, burada nə baş verir:
- "java java core java" sətrini sözlərə böldük.
- Hər söz üçün lüğətdə artıq olub-olmadığını yoxlayırıq (freq.get(w)).
- Yoxdursa (null), deməli bu sözün ilk görünüşüdür → 1 qoyuruq.
- Varsa, deməli söz artıq rast gəlinib → dəyəri bir vahid artırırıq.
Real tətbiqlər:
- API-yə müraciətlərin sayını hesablamaq,
- mətndə sözlərin tezliyi üzrə statistika,
- anbardakı malların sayını saxlamaq.
8. Təcrübə: telefon kitabçası
Gəlin bir az daha böyük bir tətbiq yazaq.
import java.util.HashMap;
import java.util.Scanner;
public class PhonebookApp {
public static void main(String[] args)
{
HashMap<String, String> phonebook = new HashMap<String, String>();
Scanner console = new Scanner(System.in);
while (true)
{
System.out.print("Adı daxil edin (və ya çıxmaq üçün boş sətir): ");
String name = console.nextLine();
if (name.isEmpty()) break;
System.out.print("Nömrəni daxil edin: ");
String phone = console.nextLine();
phonebook.put(name, phone);
}
System.out.println("Telefon kitabçası:");
for (var entry : phonebook.entrySet())
{
System.out.println(entry.getKey() + " -> " + entry.getValue());
}
}
}
Proqram mini-arayış kitabçası kimi işləyir. Siz adları və telefonları daxil edirsiniz, onlar HashMap-də saxlanılır. Sonda bütün siyahını çıxarmaq olar. Lüğətlər real layihələrdə çox tez-tez istifadə olunur.
GO TO FULL VERSION