Java’da Map Interface’i ve Implementasyonları: Hash Map, Linked Hash Map ve Daha Fazlası..

Duygu Orhan
folksdev
Published in
4 min readNov 9, 2023

--

Java’da Map , anahtahtar-değer (K,V) çiftlerinden oluşmaktadır. Burada anahtar değerlerimiz benzersizdir, tekrar edilemez. Her anahtar yalnızca bir değerle eşleşebilir.

Map bir interface sınıfıdır ve alt sınıfları bulunmaktadır. Map’in 3 ana sınıfı bulunmaktadır: HashMap, LinkedHashMap ve TreeMap. HashMap ve LinkedHashMap için Map interface sınıfından türetilmiş sınıflar, TreeMap içinse SortedMap, NaviagableMap ve Map interface sınıflarından türetilmiş sınıf diyebiliriz. Bu üretilen sınıfları 2'ye ayıracak olursak aralarındaki en önemli fark TreeMap sınıfının anahtar-değer çiftlerini sıralı olarak tutmasıdır diğer sınıflara göre. Haydi hepsini ayrı başlık altında inceleyelim..

Java Map Yapısı

HashMap<K,V>

En çok kullanılan Map sınıfıdır. Anahtar-değer çiftlerini en kolay ve hızlı performans ile işlemlerini gerçekleştiren bir sınıftır. Hızlı olmasının nedeni verileri saklamak ve kullanmak için karma işleve sahip olmaması denilebilir. HashMap sınıfı girilen değerleri sırayla kayıt etmez, belirli bir sıralaması yoktur.

HashMap’in bir diğer avantajı ise boş anahtar ve değere izin vermektedir. Bu sayede geliştiriciler kayıt endişesi duymadan değerleri çağırabilir ve kullanabilir.

Aşağıdaki kod örneklerinde öncelikle Map türü belirtilerek bir library HashMap’i oluşturulmuştur. “put” metodu ile anahtar ve değer olan kitap türü ve sayısı girilmiş ve for döngüsü ile library map’in içinde dolaşarak anahtarlar ve değerler yazdırılmıştır.(getKey(), getValue())

import java.util.HashMap;
import java.util.Map;

public class Maps {

public static void main(String args[]) {
Map<String, Integer> library = new HashMap<>();

library.put("Romantic", 2034);
library.put("Drama", 2321);
library.put("Fantastic", 3431);

System.out.println("Total genre: " + library.size());

for (Map.Entry entry : library.entrySet()) {
System.out.println(entry.getKey() + " " + entry.getValue());
}
}
}
çıktı

HashMap yerine HashTable sınıfı da kullanılabilir. Aralarındaki önemli fark HashTable sınıfında anahtar-değer verileri boş olamaz, hata verir.

Bağlantılı HashMap<K,V>

HashMap dosyasıbenzer özelliklere sahiptir. Burada HashMap’ten ayıran özelliği girilen verilerin kayıt sırasına göre kayıt edilmesidir. Bu Map’e eklenen verilerin sırasını koruması gereken durumlarda kullanılabilir.

import java.util.LinkedHashMap;
import java.util.Map;

public class Maps {

public static void main(String args[]) {
Map<String, Integer> library = new LinkedHashMap<>();

library.put("Romantic", 2034);
library.put("Drama", 2321);
library.put("Fantastic", 3431);

System.out.println("Total genre: " + library.size());

for (Map.Entry entry : library.entrySet()) {
System.out.println(entry.getKey() + " " + entry.getValue());
}
}
}
çıktı

LinkedHashMap kodunun çıktısında görüldüğü gibi girilen veriler sırayla kaydedilmiş ve gösterilmiştir.

Ağaç Haritası<K,V>

TreeMap, SortedMap sınıfını kullanarak girilen kayıtların anahtar değerlerine göre sıralama yapmaktadır. Bu sınıf da anahtar sıralamasının önemli olduğu durumlarda kullanılabilir.

TreeMap de boş değere izin verir ancak boş anahtara izin vermez.

TreeMap diğer iki sınıfa göre yavaştır bunun nedeni de belirli bir düzenle ağaç yapısıyla oluşturulmasıdır. Veriyi çekme durumunda süreç yavaş işleyecektir.


import java.util.Map;
import java.util.TreeMap;

public class Maps {

public static void main(String args[]) {
Map<String, Integer> library = new TreeMap<>();

library.put("Romantic", 2034);
library.put("Drama", 2321);
library.put("Fantastic", 3431);

System.out.println("Total genres: " + library.size());

for (Map.Entry entry : library.entrySet()) {
System.out.println(entry.getKey() + " " + entry.getValue());
}

System.out.println("Highest Book Genre: " + ((TreeMap) library).lastKey());
System.out.println("Lowest Book Genre: " + ((TreeMap) library).firstKey());

}

}
çıktı

Avantajları

  • Map ile ihtiyaç duyulan veriler hızlı bir şekilde alıp kullanılabilir.
  • Map tekrarlanan anahtar değerlerine izin vermez ve değerlere erişirken belirsizlik olmamasını sağlar.
  • Performanstan ödün verilmeden büyük veri kümeleri yönetilebilir ve düzenlenebilir.

Map seçimini özel kullanım durumunuza ve proje ihtiyaçlarınıza göre karar verebilirsiniz. Map tüm kullanım durumları için en uygun durum da olmayabilir çünkü bir aralık araması, sıralama gibi karmaşık durumlarda işiniz zorlaşacaktır. En uygun durumda kullanım ile maksimum verimliliği sağlayabilirsiniz.

Hadi Map kullanımıyla bir algoritma problemi çözelim.

Geçerli Anagram — Leetcode

Problemin açıklaması: Burada bize iki string değer verilecek. Eğer string’ler anagramsa “true”, değilse “false” sonucu dönecektir.

problemin açıklaması

Kodda yapacağımız şey bir string’i HashMap olarak (çünkü sırası önemli değil) karakter ve karakter sayısı olarak anahtar-değer atamalarını yapmak, sonrasında ise diğer string’i de karakter karakter inceleyerek eğer map’de bulunuyorsa silmek. String sonlandığında eğer map boşsa karakterler aynıdır ve karakter sayısı eşit demektir yani bu bir anagramdır ve “true” sonucu döner. Aksi halde “false” sonucu döner.

sınıf  Çözüm { 
public boolean isAnagram (String s, String t) {

if (s.length() != t.length()){
return false ;
}

HashMap<Karakter, Tamsayı> harita = new HashMap <>();

for ( int i= 0 ; i<s.length();i++){
char ch= s.charAt(i);
if (map.containsKey(ch)){
map.put(ch,map.get(ch)+ 1 );
System.out.println(map.get(ch));
}
else {
harita.put(ch, 1 );
}
}
for ( int i= 0 ; i<t.length();i++){
char ch= t.charAt(i);
if (map.containsKey(ch)){
if (map.get(ch)== 1 ){
map.remove(ch);
} else {
map.put(ch,map.get(ch)- 1 );
}
}
}

return harita.isEmpty();
}
}

Kodda kullandığımız bazı Map fonksiyonları:

map.containsKey(ch): anahtar değerinin var olup olmadığını kontrol eder, eğer varsa true, yoksa false sonucunu döndürür.

map.put(ch,1): anahtar-değer ataması yapar.

map.get(ch): anahtar değeri alır ve değerini getirir.

map.remove(ch): anahtar değeri alır Map’ten siler.

map.isEmpty(): Map’in boş olup olmadığını kontrol eder, eğer boşsa “true” değilse “false” değerini döner.

Bir sonraki yazıda görüşmek üzere..

--

--