0Pricing
Java Academy · Ders

HashMap Nasıl Çalışır

Kovalar, özetleme ve çakışmalar

HashMap Nasıl Çalışır, CoddyKit'te ücretsiz bir Java Academy dersidir. Bu, 4 dersinin 1. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Java Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Java Academy kursu toplamda 4 dersten oluşur.

HashMap Ne Saklar

Bir HashMap, anahtar-değer çiftleri saklar ve arama, ekleme ve kaldırma işlemlerinde ortalama O(1) performans sağlar.

İçeride table adlı bir dizi tutar. Bu dizideki her yuvaya bucket adı verilir.

  • Bir girdinin hangi kovaya yerleşeceğini anahtar belirler.
  • Anahtarı aradığınızda geri aldığınız şey değerdir.
import java.util.HashMap;
import java.util.Map;

public class Main {
    public static void main(String[] args) {
        Map<String, Integer> ages = new HashMap<>();
        ages.put("Alice", 30);
        ages.put("Bob", 25);
        System.out.println(ages.get("Alice"));
    }
}

Anahtarı Özetleme

put(key, value) çağrıldığında harita, bir int elde etmek için key.hashCode() çağrısını yapar.

HashMap daha sonra, zayıf özet kodlarının bile kovalar arasında dağılmasını sağlamak için bu bitleri dahili bir işlevle yayma işleminden geçirir.

  • Son sayı, kova dizinini elde etmek için hash & (table.length - 1) ile küçültülür.
  • Tablo uzunluğu her zaman ikinin kuvvetidir; bu nedenle maske işe yarar.
public class Main {
    public static void main(String[] args) {
        String key = "Alice";
        int h = key.hashCode();
        int spread = h ^ (h >>> 16);
        int index = spread & (16 - 1);
        System.out.println("hashCode: " + h);
        System.out.println("bucket index: " + index);
    }
}

Kovalar İş Başında

Her kova birden fazla girdi tutabilir. İki anahtar aynı kovaya eşlendiğinde buna çakışma denir.

Çakışmalar normaldir ve beklenir. HashMap, girdileri kova içinde birbirine bağlayarak bunları ele alır.

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

public class Main {
    public static void main(String[] args) {
        Map<Integer, String> m = new HashMap<>();
        for (int i = 0; i < 5; i++) {
            m.put(i, "v" + i);
        }
        System.out.println(m.size() + " entries stored");
    }
}

Çakışmalar ve Zincirleme

Java 8'den önce, çakışan tüm girdiler kovanın içinde tek yönlü bağlı bir listede tutulurdu.

Arama, eşleşen anahtarı bulana kadar equals() çağrıları yaparak listede ilerler.

  • Az sayıda çakışma: etkin olarak yine O(1).
  • Tek bir kovada çok sayıda çakışma: o kova için O(n) değerine doğru kötüleşir.
import java.util.HashMap;
import java.util.Map;

public class Main {
    public static void main(String[] args) {
        Map<String, Integer> m = new HashMap<>();
        m.put("FB", 1);
        m.put("Ea", 2);
        System.out.println("FB hash: " + "FB".hashCode());
        System.out.println("Ea hash: " + "Ea".hashCode());
        System.out.println(m.get("FB") + ", " + m.get("Ea"));
    }
}

FB ve Ea Neden Çakışır

"FB" ve "Ea" dizeleri Java'da aynı hashCode() değerine sahiptir. Bu, klasik bir çakışma örneğidir.

Özet kodları aynı olsa bile harita bunları ayrı tutar; çünkü equals(), kovanın içinde aralarındaki farkı belirler.

public class Main {
    public static void main(String[] args) {
        System.out.println("FB".hashCode() == "Ea".hashCode());
        System.out.println("FB".equals("Ea"));
    }
}

Yük Faktörü

Yük faktörü, büyümeden önce tablonun ne kadar dolacağını belirler. Varsayılan değer 0.75'tir.

  • Kapasite 16 ve yük faktörü 0.75 ise yeniden boyutlandırma 12 girdide tetiklenir.
  • Daha düşük bir yük faktörü belleği boşa harcar; ancak çakışmaları azaltır.
  • Daha yüksek bir yük faktörü bellekten tasarruf sağlar; ancak çakışmaları artırır.
import java.util.HashMap;
import java.util.Map;

public class Main {
    public static void main(String[] args) {
        Map<Integer, Integer> m = new HashMap<>(16, 0.75f);
        for (int i = 0; i < 12; i++) m.put(i, i);
        System.out.println("Stored " + m.size() + " entries");
    }
}

Tabloyu Yeniden Boyutlandırma

Girdi sayısı capacity * loadFactor değerini aştığında tablonun boyutu iki katına çıkar.

Var olan her girdi, yeni ve daha büyük tabloda yeniden özetlenir. Bu pahalı bir işlemdir; bu nedenle büyük haritalar için başlangıç boyutunu doğru belirlemek önemlidir.

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

public class Main {
    public static void main(String[] args) {
        // Pre-size to avoid repeated resizes
        Map<Integer, Integer> m = new HashMap<>(1024);
        for (int i = 0; i < 800; i++) m.put(i, i * 2);
        System.out.println("size = " + m.size());
    }
}

Performans İçin Başlangıç Boyutunu Belirleme

Yaklaşık olarak kaç girdi saklayacağınızı biliyorsanız, yeniden boyutlandırma işlemlerini önlemek için başlangıç kapasitesi verin.

Pratik kural: başlangıç kapasitesi = expectedSize / 0.75 + 1.

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

public class Main {
    public static void main(String[] args) {
        int expected = 1000;
        int capacity = (int) (expected / 0.75) + 1;
        Map<Integer, String> m = new HashMap<>(capacity);
        System.out.println("Initial capacity hint: " + capacity);
        m.put(1, "ok");
        System.out.println(m.get(1));
    }
}

null Anahtarlar ve Değerler

HashMap, bir null anahtara ve birden çok null değere izin verir.

  • null anahtar her zaman 0 numaralı kovaya gider (özeti 0 olarak kabul edilir).
  • Eksik bir anahtarla null değer arasındaki belirsizliği önlemek için getOrDefault kullanın.
import java.util.HashMap;
import java.util.Map;

public class Main {
    public static void main(String[] args) {
        Map<String, String> m = new HashMap<>();
        m.put(null, "nullKeyValue");
        m.put("a", null);
        System.out.println(m.get(null));
        System.out.println(m.getOrDefault("missing", "default"));
    }
}

Yineleme Sırası Garanti Edilmez

HashMap, yineleme sırası hakkında hiçbir garanti vermez. Sıra, özet kodlarına ve kova yerleşimine bağlıdır.

Öngörülebilir bir sıraya ihtiyacınız varsa LinkedHashMap (ekleme sırası) veya TreeMap (sıralı sıra) kullanın.

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

public class Main {
    public static void main(String[] args) {
        Map<String, Integer> m = new HashMap<>();
        m.put("one", 1);
        m.put("two", 2);
        m.put("three", 3);
        for (Map.Entry<String, Integer> e : m.entrySet()) {
            System.out.println(e.getKey() + "=" + e.getValue());
        }
    }
}

get() Yolunun Özeti

Bir arama şu adımları izler:

  • hashCode() hesaplanır ve bitler dağıtılır.
  • Kova dizinini bulmak için maskeleme yapılır.
  • Anahtarlar equals() ile karşılaştırılarak kovada ilerlenir.
  • Eşleşen değer döndürülür; eşleşme yoksa boş değer döndürülür.

İyi bir hashCode ile doğru equals kullanılması her adımı hızlı tutar.

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

public class Main {
    public static void main(String[] args) {
        Map<String, Integer> stock = new HashMap<>();
        stock.put("apple", 50);
        stock.put("pear", 20);
        String key = "apple";
        Integer qty = stock.get(key);
        System.out.println(key + " -> " + qty);
    }
}

Hızlı Kontrol

HashMap'in bir kovayı nasıl bulduğunu anlayıp anlamadığınızı test edin.

Özet

HashMap'in arka planda nasıl çalıştığını öğrendiniz:

  • Anahtarlar hash'lenir ve kovalara eşlenir.
  • Çakışmalar, girdilerin bir kovada zincirlenmesiyle ele alınır.
  • Yük faktörü (0.75), tablonun iki katına çıkarılmasını ve yeniden hash'lenmesini tetikler.
  • Başlangıçta uygun boyutlandırma, maliyetli yeniden boyutlandırmaları önler; yineleme sırası garanti edilmez.

Sırada, doğru bir equals olmadan yalnızca hashCode'un neden yeterli olmadığını göreceksiniz.

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

public class Main {
    public static void main(String[] args) {
        Map<String, Integer> m = new HashMap<>(64);
        m.put("recap", 1);
        System.out.println("HashMap basics complete: " + m.get("recap"));
    }
}

Sıkça Sorulan Sorular

“HashMap Nasıl Çalışır” dersi ücretsiz mi?

Evet — “HashMap Nasıl Çalışır” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Java Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Java Academy kursu toplamda 4 dersten oluşur.

“HashMap Nasıl Çalışır” dersinde ne öğreneceğim?

Kovalar, özetleme ve çakışmalar Java Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Java Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Java Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 1. dersidir.

“HashMap Nasıl Çalışır” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Java Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Java Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. HashMap Nasıl Çalışır
  2. equals/hashCode Sözleşmesi
  3. hashCode Uygulama
  4. Ağaçlaştırma ve Performans
← Java Academy Sayfasına Dön