HashMap, verileri Anahtar-Değer (Key-Value) çiftleri şeklinde saklayan bir koleksiyon yapısıdır. Önceki derslerimizde gördüğümüz List ve HashSet yapılarından farklı olarak, HashMap veriye bir indeks numarasıyla değil, ona atadığımız özel bir anahtar üzerinden ulaşmamızı sağlar.
1. HashMap Tanımlama ve Oluşturma
HashMap tanımlarken anahtarın ve değerin veri türlerini belirtmek, tip güvenliği (type safety) açısından büyük önem taşır.
import 'dart:collection';
void main() {
// 1. İçeriği dolu bir Map oluşturma (Literal yöntem)
var plaka = {"antalya": 7, "malatya": 44};
// 2. Türü belirtilmiş boş bir HashMap oluşturma
// Anahtar (Key): int, Değer (Value): String olacak şekilde tanımlandı
var sehirler = HashMap<int, String>();
print(plaka); // {antalya: 7, malatya: 44}
}2. Veri Ekleme ve Güncelleme
HashMap yapısında veri eklemek oldukça pratiktir. Köşeli parantez [] içerisine anahtarı yazıp değer ataması yapmanız yeterlidir.
// Değer ekleme
sehirler[27] = "Antep";
sehirler[69] = "Bayburt";
print(sehirler); // {27: Antep, 69: Bayburt}Veri Güncelleme
Eğer halihazırda var olan bir anahtara yeni bir değer atarsanız, eski değer güncellenir. HashMap’te anahtarlar benzersizdir (unique), ancak değerler değişebilir.
sehirler[27] = "Gaziantep";
print(sehirler); // {27: Gaziantep, 69: Bayburt}3. Veri Okuma ve Kontroller
HashMap içindeki verilere erişirken anahtarı kullanırız. Ancak veri okurken dikkat edilmesi gereken bazı önemli noktalar vardır.
Spesifik Bir Veriyi Okuma
Bir anahtarın karşılığını alırken, Dart o anahtarın listede olup olmadığından emin olamayacağı için değer null dönebilir. Bu durumu yönetmek için ! operatörünü kullanırız.
// Değerin karşılığı var mı?
String sehir = sehirler[69]!; // ! operatörü değerin null olmayacağını garanti eder
print(sehir); // Bayburt4. Liste Durum Kontrolleri (Boyut ve Boşluk)
Uygulama geliştirirken listenin dolu olup olmadığını veya kaç elemanı olduğunu sıkça kontrol etmemiz gerekir.
length: Eleman sayısını (boyutunu) verir.isEmpty: Boş isetrue, dolu isefalsedöner.isNotEmpty: Dolu isetruedöner.
print("Boyut kontrol : ${sehirler.length}"); // Boyut Kontrol : 2
print("Boş kontrol : ${sehirler.isEmpty}"); // Boş kontrol : false
print("Boş kontrol : ${sehirler.isNotEmpty}"); // Boş kontrol : true5. Verileri Anlamlı Okuma (Döngüler)
HashMap içerisindeki tüm verileri kullanıcıya göstermek için anahtarlar (keys) üzerinden bir döngü kurmak en sağlıklı yöntemdir.
For-in Döngüsü ile Listeleme
var anahtarlar = sehirler.keys;
for(var a in anahtarlar){
print("$a -> ${sehirler[a]}");
}
// Program Çıktısı
/*
27 -> Gaziantep
69 -> Bayburt
*/7. Veri Silme İşlemleri
HashMap’ten veri çıkarmak için anahtar bilgisini kullanmak yeterlidir.
remove() Metodu
Belirtilen anahtarı (key) ve ona bağlı olan değeri (value) tamamen siler.
sehirler.remove(69); // 69 key i olan veri silinir
print(sehirler); // {27: Gaziantep}clear() Metodu
Tüm koleksiyonu tek seferde sıfırlamak için kullanılır.
// HashMap tamamen temizleme
sehirler.clear();
print(sehirler); // {}Sonuç
Neden HashMap Kullanmalıyız?
HashMap, milyonlarca veri içerisinden belirli bir anahtara göre arama yaparken sabit zamanlı performans sunar. Eğer verilerinize bir isim, ID veya kod aracılığıyla (örneğin plaka kodu veya T.C. kimlik numarası) ulaşmanız gerekiyorsa, HashMap sizin için en doğru veri yapısıdır.
- Sıralama: HashMap verileri belirli bir sırada tutma garantisi vermez.
- Hız: Veriye erişim hızı en yüksek yapılardan biridir.
- Benzersizlik: Anahtarlar tektir, aynı anahtarla iki farklı kayıt tutulamaz.
Bu yazımızla birlikte Dart dilindeki temel koleksiyon yapılarını (List, HashSet, HashMap) tamamlamış olduk. Projenizin ihtiyacına göre doğru yapıyı seçmek, daha kaliteli ve performanslı uygulamalar geliştirmenizi sağlayacaktır.