HashMap ve TreeMap farkı temel olarak veriye nasıl eriştiğin ve anahtarların sıralı olup olmayacağıyla ilgilidir. Yalnızca verilen anahtarla eşleşen kayda erişmek önceliğinse HashMap; anahtarları sıralı tutmak, en yakın anahtarı bulmak veya aralık sorguları yapmak istiyorsan TreeMap daha uygun seçimdir. Her iki yapı da anahtar-değer ilişkisi kurar ve aynı anahtara ikinci bir değer yazıldığında mevcut değer güncellenir.
HashMap, anahtarın hash değerinden yararlanarak eşleşen kaydı bulmaya çalışır ve herhangi bir anahtar sırası garantisi vermez. TreeMap ise anahtarları doğal sıralamaya veya oluşturulurken verilen Comparator düzenine göre tutar. Buradaki kritik ayrım, TreeMap’in değerleri değil, anahtarları sıralamasıdır; değerler, kendileri için ayrı bir sıralama işlemi yapılmadıkça anahtarlara bağlı kayıtlar olarak kalır. Java koleksiyonlarını uygulama üzerinde karşılaştırmak isteyenler, birebir Java yazılım ve kodlama kursu kapsamında bu ayrımı kendi örnekleriyle pekiştirebilir.
HashMap ve TreeMap farkı: Kısa cevap
Map<K,V> yapısında K anahtarın, V ise anahtara bağlanan değerin türünü temsil eder. Örneğin öğrenci numarasını anahtar, öğrencinin adını değer olarak saklayabilirsin. HashMap bu ilişkiyi sıralama ihtiyacı olmadan yönetmeye odaklanırken TreeMap, anahtarların düzenli biçimde dolaşılmasını ve anahtar aralıkları üzerinde çalışılmasını sağlar.
Bu nedenle seçim yaparken şu kısa kural kullanılabilir:
- Doğrudan anahtar erişimi: Anahtar verildiğinde ilgili değeri bulmak temel işleminse
HashMapöne çıkar. - Sıralı anahtarlar: Kayıtları küçükten büyüğe, alfabetik olarak veya özel bir karşılaştırıcıya göre dolaşman gerekiyorsa
TreeMapkullanılır. - Aralık ve komşu anahtar işlemleri: Belirli iki anahtar arasındaki kayıtları almak ya da verilen anahtardan büyük veya küçük en yakın anahtarı bulmak gerekiyorsa
TreeMap’in gezinilebilir harita özellikleri avantaj sağlar.
HashMap ve TreeMap hangi özelliklerde ayrılır?

Aşağıdaki tablo, iki Java Map uygulamasını seçim yaparken en çok etkileyen noktalar üzerinden karşılaştırır. Sıra bilgisi, null davranışı ve yinelenen anahtarların nasıl ele alındığı doğrudan API sözleşmeleriyle ilişkilidir.
| Ölçüt | HashMap | TreeMap |
|---|---|---|
| Anahtar sırası | Herhangi bir sıra garantisi vermez. | Anahtarları doğal sıralama veya verilen Comparator düzeninde tutar. |
| Tam anahtar araması | Hash tablosu ve anahtar eşitliği üzerinden çalışır. | compareTo veya Comparator karşılaştırmasına göre çalışır. |
| Null anahtar ve null değer davranışı | Bir null anahtara ve null değerlere izin verir. |
Doğal sıralamada null anahtar kabul edilmez; null destekleyen bir Comparator ile mümkün olabilir. Null değerler anahtar sıralamasına katılmadığı için saklanabilir. |
| Yinelenen anahtar | Aynı anahtarla yapılan ikinci put, eski değeri yenisiyle değiştirir. |
Karşılaştırma sonucu sıfır olan anahtar aynı kabul edilir ve eski değer değiştirilir. |
| Temel işlem karmaşıklığı | get ve put için uygun hash dağılımı varsayımıyla sabit zamanlı davranış beklenir. |
containsKey, get, put ve remove için garantili logaritmik zaman maliyeti belirtilir. |
| Uygun kullanım biçimi | Sıralama gerektirmeyen, anahtara dayalı doğrudan erişim senaryoları. | Sıralı dolaşma, en küçük-en büyük anahtar ve aralık sorgusu senaryoları. |
HashMap için sabit zaman ifadesi mutlak bir performans vaadi değildir. Java SE API dokümantasyonu bu davranışı, hash işlevinin kayıtları bölmelere iyi dağıtması koşuluna bağlar. Kötü hashCode() dağılımı, çok sayıda çakışma, kapasitenin yeniden düzenlenmesi ve veri büyüklüğü gerçek çalışma süresini etkileyebilir. TreeMap için belirtilen logaritmik maliyet ise anahtar karşılaştırmalarına dayanır; doğal sıralamanın veya kullanılan Comparator’ın maliyeti de toplam süreyi etkileyebilir. Bu yüzden karmaşıklıklar, ölçüm yapılmadan “her durumda daha hızlı” anlamına gelmez.
Null değer saklanan bir haritada get() metodunun null döndürmesi, anahtarın bulunamadığı anlamına tek başına gelmez; gerçekten kayıt olup olmadığını ayırt etmek için containsKey() kullanılmalıdır. Ayrıca TreeMap’te anahtarların karşılaştırma düzeni, mümkün olduğunca equals() ile tutarlı olmalıdır. Aksi hâlde compareTo() veya Comparator iki farklı nesneyi aynı anahtar gibi değerlendirebilir.
Öğrenci notlarında iki veri yapısını birlikte kullanma

Öğrenci notu gibi bir senaryoda HashMap ve TreeMap aynı görevi yapmak zorunda değildir. HashMap, öğrenci numarasından nota hızlıca ulaşmak için; TreeMap ise notları puan anahtarına göre sıralı bir rapora dönüştürmek için kullanılabilir. HashMap dolaşım sırası garanti etmezken TreeMap, anahtarlarını doğal sıralamaya veya verilen karşılaştırıcıya göre düzenler.
import java.util.*;
public class GradeReport {
public static void main(String[] args) {
Map<Integer, Integer> gradeByStudentNo = new HashMap<>();
gradeByStudentNo.put(104, 85);
gradeByStudentNo.put(101, 92);
gradeByStudentNo.put(110, 85);
int selectedGrade = gradeByStudentNo.get(101);
TreeMap<Integer, List<String>> studentsByGrade = new TreeMap<>();
for (Map.Entry<Integer, Integer> entry
: gradeByStudentNo.entrySet()) {
studentsByGrade
.computeIfAbsent(entry.getValue(),
grade -> new ArrayList<>())
.add(String.valueOf(entry.getKey()));
}
// Liste içindeki öğrenci sırasını ayrıca belirliyoruz.
for (List<String> students : studentsByGrade.values()) {
Collections.sort(students);
}
System.out.println(selectedGrade);
System.out.println(studentsByGrade.keySet());
System.out.println(studentsByGrade);
}
}
Bu örnekte gradeByStudentNo.get(101) ifadesinin beklenen çıktısı 92 olur. HashMap içindeki kayıtlar rapora aktarılırken kaynak dolaşım sırası dikkate alınmaz. TreeMap anahtarları puan olduğu için anahtar kümesi [85, 92] biçiminde görünür. Ancak önemli ayrım şudur: TreeMap değerleri değil, anahtarları sıralar. Bu nedenle her puana karşılık gelen öğrenci listesinin sırası ayrıca belirlenmelidir; örnekte listeler Collections.sort ile sıralanmıştır. entrySet() dolaşımının sırasını rapor mantığının temeli yapmak doğru değildir.
92
[85, 92]
{85=[104, 110], 92=[101]}
Dört soruyla doğru veri yapısını seçme
HashMap ve TreeMap arasında seçim yaparken önce veri üzerinde hangi işlemlerin yapılacağını belirle. TreeMap; sıralı dolaşımın yanı sıra subMap, headMap, tailMap, firstKey, lastKey, lowerKey ve higherKey gibi gezinme işlemleri sunar.
- Kayıtlar anahtarlarına göre sıralı dolaşılacak mı? Evetse TreeMap tercih edilir. Örneğin öğrenci numaralarını küçükten büyüğe raporlamak istiyorsan sıralama doğrudan haritanın davranışının parçası olur. Sıralı dolaşım gerekmiyorsa HashMap daha uygun bir başlangıçtır.
- Belirli bir anahtar aralığı, alt küme, en küçük/en büyük veya komşu anahtar işlemi gerekiyor mu? Örneğin 70 ile 90 arasındaki puanları almak, en yüksek puanı bulmak ya da belirli bir puanın hemen altındaki değere ulaşmak istiyorsan TreeMap’in sıralı ve gezinilebilir yapısı işini kolaylaştırır.
- Yoksa yalnızca tam anahtarla kayda erişmek yeterli mi? “101 numaralı öğrencinin notu nedir?” gibi doğrudan erişimlerde HashMap genellikle yeterlidir. HashMap için sabit zaman ifadesi, hash değerlerinin dengeli dağılması koşuluna bağlıdır; TreeMap’in
get,putve benzeri temel işlemleri için logaritmik zaman maliyeti garanti edilir. Bunlar mutlak performans vaadi değil, veri yapısının çalışma modelini anlatan karmaşıklık ifadeleridir. - Anahtarlar tutarlı biçimde karşılaştırılabiliyor ve null anahtar politikası seçilen yapıyla uyumlu mu? TreeMap kullanacaksan anahtarlar doğal sıralamaya sahip olmalı veya uygun bir
Comparatorverilmelidir.Integeranahtarlar doğal olarak karşılaştırılabilir; ancak doğal sıralamadaki TreeMap null anahtarı kabul etmez. HashMap ise null anahtara ve null değerlere izin verir. Karşılaştırıcınınequalsile tutarlı olması da beklenmeyen anahtar eşleşmelerini önlemek açısından önemlidir.
Bu ayrımı uygulayarak pekiştirmek ve Java ile algoritmik düşünme seviyeni ölçmek istersen, ücretsiz bilgi testlerine göz atabilirsin.
Sıralama gereksinimi yoksa harita seçimini yalnızca ‘hangisi daha hızlı?’ sorusuna indirgemek eksik karardır.
Karmaşıklık ve API sınırlarını doğru yorumlama
Sıralama veya aralık sorgusu gerekmiyorsa HashMap, anahtarların sıralı tutulması ya da floorKey ve subMap gibi işlemler gerekiyorsa TreeMap daha uygun başlangıçtır. HashMap, hash dağılımı iyi olduğunda temel erişim ve ekleme işlemlerinde sabit zamanlı performans sunar; TreeMap ise bu işlemler için garantili log(n) maliyetine sahiptir. Bu ifadeler mutlak hız vaadi değildir; anahtar davranışı, çakışmalar, karşılaştırıcı ve veri büyüklüğü sonucu etkiler.
HashMap seçiminde anahtarların tutarlı hashCode() ve equals() uygulamasına sahip olması önemlidir. Çok sayıda anahtarın aynı hash değerini üretmesi erişimi yavaşlatabilir. TreeMap ise anahtarları doğal sıralama veya verilen Comparator ile karşılaştırır; karşılaştırıcı tutarlı, geçişli ve mümkün olduğunca equals ile uyumlu olmalıdır. Aksi hâlde iki farklı nesne haritanın bakış açısından aynı anahtar kabul edilebilir.
| Ölçüt | HashMap | TreeMap |
|---|---|---|
| Anahtar sırası | Garanti edilmez | Doğal veya Comparator sırası |
| Temel işlemler | Hash dağılımına bağlı sabit zamanlı | Garantili log(n) |
| Yinelenen anahtar | Eski değer güncellenir | Eski değer güncellenir |
| Null anahtar | İzin verilir | Doğal sıralamada izin verilmez |
Aşağıdaki örnek, yinelenen anahtarın güncellenmesini ve TreeMap ile aralık görünümü almayı gösterir:
import java.util.HashMap;
import java.util.TreeMap;
public class MapOrnegi {
public static void main(String[] args) {
HashMap<String, Integer> puanlar = new HashMap<>();
puanlar.put("Java", 36);
puanlar.put("Java", 40);
TreeMap<Integer, String> sirali = new TreeMap<>();
sirali.put(20, "B");
sirali.put(10, "A");
sirali.put(30, "C");
sirali.put(20, "Güncellendi");
System.out.println(puanlar.get("Java"));
System.out.println(sirali);
System.out.println(sirali.subMap(10, true, 30, true));
}
}
Beklenen çıktı şöyledir:
40
{10=A, 20=Güncellendi, 30=C}
{10=A, 20=Güncellendi, 30=C}
Uygulanabilir kontrol listesi
- Sıralama: Anahtar sırası veya aralık sorgusu gerçekten gerekli mi?
- Veri hacmi: Haritada yaklaşık kaç kayıt bulunacak? HashMap kapasitesi ve yeniden boyutlandırma ihtiyacı düşünülmeli.
- Hash sözleşmesi: Anahtarların
hashCode()veequals()davranışı tutarlı mı? - Çakışmalar: Anahtarların kötü hash dağılımı oluşturma ihtimali var mı?
- Karşılaştırıcı: TreeMap kullanılıyorsa karşılaştırmanın maliyeti ve
equalsile tutarlılığı uygun mu? - Null politikası: Null anahtar veya değer kullanımı gerçekten gerekli mi? İki haritanın bu konudaki davranışı tasarımla uyumlu mu?
- Güncelleme: Aynı anahtar yeniden eklenince eski değerin değişmesi beklenen davranış mı?
Dört soruluk seçim çerçevesi
- Anahtarları sıralı gezmem veya bir aralık seçmem gerekiyor mu?
- Önceliğim doğrudan anahtar erişimi mi, yoksa sıralı gezinme mi?
- Hash veya karşılaştırma sözleşmesi kullandığım anahtar türüyle uyumlu mu?
- Null ve aynı anahtarın güncellenmesiyle ilgili politika net mi?
Sıralama gereksinimi yoksa harita seçimini yalnızca “hangisi daha hızlı?” sorusuna indirgemek eksik karardır. Seçim; gereksinim, sıralama ve aralık ihtiyacı ile veri yapısının API sözleşmesi birlikte değerlendirilerek yapılmalıdır.
Sık Sorulan Sorular
TreeMap değerleri de anahtarlarla birlikte sıralar mı?
Hayır. TreeMap anahtarları sıralar; değerleri kendi büyüklüklerine veya alfabetik özelliklerine göre sıralamaz. Gezinti sırasında değerler, bağlı oldukları anahtarın sıralı konumuyla birlikte görülür.
HashMap ve TreeMap aynı anahtarla tekrar veri eklenirse ne olur?
İki haritada da aynı anahtara tekrar put uygulanırsa yeni değer eski değerin yerini alır. HashMap anahtarı equals ve hashCode ile; TreeMap ise sıralama veya karşılaştırma sonucu eşit kabul edilen anahtarla değerlendirir.
HashMap ile TreeMap null anahtar ve null değerleri nasıl ele alır?
HashMap bir null anahtara ve null değerlere izin verir. TreeMap doğal sıralama kullanıyorsa null anahtarı kabul etmez; özel Comparator null anahtara izin veriyorsa davranış ona bağlıdır. TreeMap null değer taşıyabilir. get sonucu null olduğunda anahtarın bulunup bulunmadığını anlamak için containsKey kullanılmalıdır.
Sıralama gerekmiyorsa TreeMap kullanmak mantıklı olur mu?
Genellikle yalnızca sıralama gerekmiyor diye TreeMap seçilmez. Ancak aralık sorguları, en yakın anahtarı bulma veya sıralı gezinme gibi TreeMap özellikleri kullanılacaksa seçim yine mantıklı olabilir.
Doğru harita, teorik olarak en hızlı görünen değil, verinin nasıl aranacağı ve hangi sözleşmenin korunacağıyla uyumlu olandır.