Bölüm 5 · Simülatör

Koleksiyonların İç Yapısı

← Bölüm 5
List<String> liste = new ArrayList<>(4);

Koleksiyonların İç Yapısı

Amaç: ArrayList ve HashMap yöntemlerinin içeride ne yaptığını ve kaç birim iş tuttuğunu görmek.

ArrayList

  • Öğeler içteki bir dizide tutulur. size() dolu hücre sayısıdır; kapasite dizinin uzunluğudur.
  • Dizi dolunca yeni kapasite eski + eski / 2 (yaklaşık 1,5 kat) olur, bütün öğeler yeni diziye kopyalanır. new ArrayList<>() diziyi ilk add çağrısında 10 hücreyle ayırır.
  • add(i, e) ve remove(i) i'den sonraki öğeleri birer hücre kaydırır: O(n). get(i) ve sona ekleme O(1); arada bir yapılan kopyalama sona eklemeyi amortize O(1) yapar.

HashMap

  • Anahtarın hashCode() değeri h ^ (h >>> 16) ile karıştırılır; & (n − 1) son bitleri alarak kova numarasını verir (n: kova sayısı, 2'nin kuvveti).
  • Aynı kovaya düşen girdiler bir zincir (bağlı liste) oluşturur. Arama önce hash'leri karşılaştırır; equals yalnızca hash'ler eşitse çağrılır. "Aa" ile "BB"'nin hashCode() değeri aynıdır (2112).
  • Girdi sayısı eşiği (kova sayısı × 0,75) aşınca kova sayısı ikiye katlanır; her girdi ya aynı kovada kalır ya da i + eski n kovasına geçer.
  • Bir zincir 8 girdiyi aşınca Java onu ağaca dönüştürür (tablo küçükse önce büyütür); bu simülatör kova başına en çok 8, toplam en çok 24 girdi gösterir.

Nasıl kullanılır?

  1. Soldan yapıyı seçin, bir işlem düğmesine basın. İşlem adım adım oynar; Kendiliğinden oynat kapalıysa Adım ▶ (klavyede →) ile ilerler, Sona ⏭ işlemi bitirir.
  2. Alttaki sayaçlar birim işlemleri gösterir: kaydırma, kopyalama, karşılaştırma, yeniden yerleştirme.
  3. Kendini dene açıkken işlemden önce kaç öğenin kayacağını, yeni kapasiteyi ya da kova numarasını tahmin edersiniz.
  4. Kıyasla sekmesi n öğeli bir yapıda tipik işlemlerin yaklaşık adım sayılarını yan yana koyar.

Kapasite dizileri ve kova yerleşimi, aynı anahtarlarla gerçek Java 8 ArrayList ve HashMap nesnelerinin iç alanları okunarak doğrulanmıştır.

İlgili sunum: Bölüm 5 · Koleksiyonlar (ArrayList Nasıl Büyür?, Ortaya Ekleme ve Silme, HashSet ve Karma, HashMap Sınıfı).