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:

  1. hash = k.hashCode() ^ (h >>> 16) ile hash'in üst bitleri alt bitlere karıştırılır.
  2. Index = hash & (n - 1) (n her zaman 2'nin kuvveti olduğu için mod yerine bit maskesi).
  3. 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 null key'e izin verir (bucket 0). ConcurrentHashMap null key/value kabul etmez.
  • Thread-safe değildir. Eşzamanlı yazmalarda veri kaybı olur; ConcurrentHashMap kullanın (bucket bazlı CAS + synchronized ile kilitlenir, tüm haritayı kilitlemez).
  • Ortalama get/put O(1), en kötü durumda Java 8+ ile O(log n).
  1. Java 21 virtual thread'ler nedir? Platform thread'lerden farkı nedir ve hangi durumlarda dikkatli olmak gerekir?OrtaJava & SpringBackend
  2. ExecutorService ve CompletableFuture ile asenkron iş nasıl yapılır? Thread pool boyutunu nasıl belirlersiniz?OrtaJava & SpringBackend
  3. JPA/Hibernate'te lazy ve eager loading farkı nedir? LazyInitializationException neden oluşur ve nasıl çözülür?OrtaJava & SpringBackend
  4. @Transactional anotasyonu hangi durumlarda çalışmaz? Self-invocation, rollback kuralları ve propagation tuzaklarını açıklayın.ZorJava & SpringBackend
  5. Spring bean scope'ları nelerdir? Singleton bir bean'e prototype bean inject edilirse ne olur?KolayJava & SpringBackend
  6. Spring'de Dependency Injection nedir? Constructor injection neden field injection'a tercih edilir?KolayJava & SpringBackend

Bu konuda başka bir soru biliyor musun?

Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.

Soru ekle