HashMap içeride nasıl çalışır? Collision nasıl çözülür ve Java 8 ile ne değişti?
Cevap
HashMap bir bucket dizisi (Node<K,V>[] table) tutar. put(k, v) sırasında:
hash = k.hashCode() ^ (h >>> 16)ile hash'in üst bitleri alt bitlere karıştırılır.- Index =
hash & (n - 1)(n her zaman 2'nin kuvveti olduğu için mod yerine bit maskesi). - Bucket boşsa yeni node eklenir; doluysa zincirde
equals()ile aynı key aranır, varsa değer güncellenir, yoksa sona eklenir.
Collision ve treeify (Java 8+)
- Aynı bucket'a düşen elemanlar önce linked list olarak tutulur.
- Bir bucket'taki eleman sayısı 8'i geçerse ve tablo kapasitesi en az 64 ise liste kırmızı-siyah ağaca (TreeNode) dönüşür; arama O(n) yerine O(log n) olur. 6'nın altına inince tekrar listeye döner.
- Bu değişiklik, kötü hash'li key'lerle yapılan hash-flooding saldırılarının etkisini azaltır.
Resize
- Varsayılan kapasite 16, load factor 0.75. Eleman sayısı
kapasite * 0.75'i aşınca tablo 2 katına çıkar ve elemanlar yeniden dağıtılır. - Kaç eleman koyacağınızı biliyorsanız başlangıç kapasitesi vermek gereksiz resize'ları önler. Java 19+
HashMap.newHashMap(1000)bunu sizin için hesaplar.
Diğer önemli noktalar
- Bir adet
nullkey'e izin verir (bucket 0).ConcurrentHashMapnull key/value kabul etmez. - Thread-safe değildir. Eşzamanlı yazmalarda veri kaybı olur;
ConcurrentHashMapkullanın (bucket bazlı CAS + synchronized ile kilitlenir, tüm haritayı kilitlemez). - Ortalama
get/putO(1), en kötü durumda Java 8+ ile O(log n).
İlgili Java & Spring soruları
- Java 21 virtual thread'ler nedir? Platform thread'lerden farkı nedir ve hangi durumlarda dikkatli olmak gerekir?
- ExecutorService ve CompletableFuture ile asenkron iş nasıl yapılır? Thread pool boyutunu nasıl belirlersiniz?
- JPA/Hibernate'te lazy ve eager loading farkı nedir? LazyInitializationException neden oluşur ve nasıl çözülür?
- @Transactional anotasyonu hangi durumlarda çalışmaz? Self-invocation, rollback kuralları ve propagation tuzaklarını açıklayın.
- Spring bean scope'ları nelerdir? Singleton bir bean'e prototype bean inject edilirse ne olur?
- Spring'de Dependency Injection nedir? Constructor injection neden field injection'a tercih edilir?
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.