Java'da HashMap ve Hashtable'ın Karşılaştırılması: Temel Farklılıklar ve Verimlilik

Java'da HashMap ve Hashtable'ın Karşılaştırılması: Temel Farklılıklar ve Verimlilik
Java

Java'da HashMap ve Hashtable'ı Anlamak

Java koleksiyonları dünyasında HashMap ve Hashtable, anahtar/değer çiftlerini depolamak için yaygın olarak kullanılan iki veri yapısıdır. Benzer görünseler de uygulamanızın performansını ve iş parçacığı güvenliğini etkileyebilecek belirgin farklılıkları vardır. Bu farklılıkları anlamak, ihtiyaçlarınız için doğru olanı seçmek açısından çok önemlidir.

Bu makale, HashMap ve Hashtable arasındaki temel ayrımları ele alarak bunların işlevlerini, verimliliklerini ve iş parçacığı olmayan uygulamalara uygunluklarını araştırıyor. Sonunda, özel kullanım senaryonuzda hangi veri yapısını kullanacağınız konusunda daha net bir fikre sahip olacaksınız.

Emretmek Tanım
HashMap.put() HashMap'e bir anahtar/değer çifti ekler. Boş anahtarlara ve değerlere izin verir.
Hashtable.put() Hashtable'a bir anahtar/değer çifti ekler. Boş anahtarlara veya değerlere izin vermez.
System.nanoTime() Çalışan Java Sanal Makinesinin yüksek çözünürlüklü zaman kaynağının geçerli değerini nanosaniye cinsinden döndürür.
try { ... } catch (NullPointerException e) Hashtable.put() işlevinin boş değerlerle çağrıldığı durumları işleyerek kodu yürütmeye çalışır ve herhangi bir NullPointerException'ı yakalar.
HashMap.get() HashMap'ten belirtilen bir anahtarla ilişkili değeri alır.
Hashtable.get() Hashtable'dan belirtilen bir anahtarla ilişkili değeri alır.

HashMap ve Hashtable Uygulamasının Derinlemesine İncelemesi

İlk senaryo, arasında doğrudan bir karşılaştırma sağlar. HashMap Ve Hashtable Java'da. Betik, gerekli sınıfları içe aktararak ve her iki veri yapısının örneklerini oluşturarak başlar. A HashMap örneklenir ve anahtar/değer çiftleriyle doldurulur. Benzer şekilde, bir Hashtable oluşturulur ve doldurulur. Bu komut dosyası daha sonra boş değerlerin işlenmesindeki temel farkı gösterir. HashMap.put() boş değerlerin sorunsuz bir şekilde eklenmesine izin verir, oysa Hashtable.put() atar NullPointerException boş anahtarlar veya değerler eklenmeye çalışılırsa. try { ... } catch (NullPointerException e) Bu davranışı göstermek için bloklar kullanılır. Betik, geliştiricilerin bu iki veri yapısı arasında seçim yaparken ne zaman ve neden boş değerlerin dikkate alınması gerektiğini anlamalarına yardımcı olur.

İkinci senaryo, performans testine odaklanır. HashMap Ve Hashtable iş parçacığı olmayan bir ortamda. Her iki haritanın da başlatılmasıyla ve bir milyon anahtar/değer çiftinin eklenmesi için geçen sürenin ölçülmesiyle başlar. System.nanoTime(). Bu yüksek çözünürlüklü zaman ölçümü, operasyonlar için harcanan zamanın kesin olarak yakalanmasına yardımcı olur. Sonuçlar göreceli performansı gösterecek şekilde konsola yazdırılır. Komut dosyası aynı zamanda her iki veri yapısından aynı anahtar kümesi için alma süresini de ölçer. Geliştiriciler bu süreleri karşılaştırarak iş parçacığı olmayan uygulamalarda hangi veri yapısının daha iyi performans gösterdiğini ölçebilir. Bu komut dosyası özellikle performansın ayarlanması ve ilgili ek yükün anlaşılması için kullanışlıdır. Hashtable senkronize yöntemleri nedeniyle.

HashMap ve Hashtable'ın Karşılaştırılması: Temel Farklılıklar ve Kullanım Durumları

Karşılaştırma için Java Uygulaması

import java.util.HashMap;
import java.util.Hashtable;

public class MapComparison {
    public static void main(String[] args) {
        // Creating a HashMap
        HashMap<String, String> hashMap = new HashMap<>();
        hashMap.put("1", "One");
        hashMap.put("2", "Two");
        hashMap.put("3", "Three");

        // Creating a Hashtable
        Hashtable<String, String> hashtable = new Hashtable<>();
        hashtable.put("A", "Apple");
        hashtable.put("B", "Banana");
        hashtable.put("C", "Cherry");

        // Displaying the HashMap
        System.out.println("HashMap: " + hashMap);

        // Displaying the Hashtable
        System.out.println("Hashtable: " + hashtable);

        // Checking for null values
        try {
            hashMap.put(null, "NullValue");
            System.out.println("HashMap allows null values: " + hashMap);
        } catch (NullPointerException e) {
            System.out.println("HashMap does not allow null values");
        }
        try {
            hashtable.put(null, "NullValue");
            System.out.println("Hashtable allows null values: " + hashtable);
        } catch (NullPointerException e) {
            System.out.println("Hashtable does not allow null values");
        }
    }
}

HashMap vs. Hashtable: Tek İş Parçacıklı Ortamlarda Performans

İş Parçacığı Olmayan Uygulamalar için Java Performans Testi

import java.util.HashMap;
import java.util.Hashtable;

public class PerformanceTest {
    public static void main(String[] args) {
        // Initializing the maps
        HashMap<Integer, Integer> hashMap = new HashMap<>();
        Hashtable<Integer, Integer> hashtable = new Hashtable<>();

        // Adding elements to HashMap
        long startTime = System.nanoTime();
        for (int i = 0; i < 1000000; i++) {
            hashMap.put(i, i);
        }
        long endTime = System.nanoTime();
        System.out.println("HashMap time: " + (endTime - startTime) + " ns");

        // Adding elements to Hashtable
        startTime = System.nanoTime();
        for (int i = 0; i < 1000000; i++) {
            hashtable.put(i, i);
        }
        endTime = System.nanoTime();
        System.out.println("Hashtable time: " + (endTime - startTime) + " ns");

        // Retrieving elements from HashMap
        startTime = System.nanoTime();
        for (int i = 0; i < 1000000; i++) {
            hashMap.get(i);
        }
        endTime = System.nanoTime();
        System.out.println("HashMap retrieval time: " + (endTime - startTime) + " ns");

        // Retrieving elements from Hashtable
        startTime = System.nanoTime();
        for (int i = 0; i < 1000000; i++) {
            hashtable.get(i);
        }
        endTime = System.nanoTime();
        System.out.println("Hashtable retrieval time: " + (endTime - startTime) + " ns");
    }
}

HashMap ve Hashtable: Senkronizasyon ve Konu Güvenliği

Aradaki en önemli farklardan biri HashMap Ve Hashtable senkronizasyon ve iş parçacığı güvenliğine yaklaşımlarıdır. Hashtable senkronize edilir, yani iş parçacığı açısından güvenlidir ve eşzamanlılık sorunlarına neden olmadan birden fazla iş parçacığı arasında paylaşılabilir. Bu senkronizasyon, yöntemlerinin çoğunun senkronize edilmesiyle gerçekleştirilir; bu, herhangi bir zamanda yalnızca bir iş parçacığının Hashtable'a erişebilmesini sağlar. Ancak bu aynı zamanda kilitleme mekanizmasından dolayı performans yükünü de beraberinde getirir. Hashtable karşılaştırıldığında daha yavaş HashMap tek iş parçacıklı senaryolarda.

Tersine, HashMap senkronize edilmemiştir ve bu nedenle iş parçacığı açısından güvenli değildir. Eğer bir HashMap Aynı anda birden fazla iş parçacığı tarafından erişildiğinde, veri tutarsızlığı ve yarış koşulları riski vardır. Yapmak HashMap iş parçacığı güvenli, geliştiriciler kullanabilir Collections.synchronizedMap() senkronize edilmiş bir haritaya sarmak için veya ConcurrentHashMap Haritanın farklı bölümlerine eşzamanlı erişime izin vererek daha iyi performans sağlayan, Java 1.5'te tanıtılan sınıf. Bu yapar ConcurrentHashMap eşzamanlı uygulamalar için daha verimli bir seçim.

HashMap ve Hashtable Hakkında Sıkça Sorulan Sorular

  1. HashMap ve Hashtable arasındaki temel fark nedir?
  2. HashMap senkronize edilmez ve boş anahtarlara ve değerlere izin verir; Hashtable senkronize edilir ve boş anahtarlara veya değerlere izin vermez.
  3. Tek iş parçacıklı bir ortamda hangisi daha hızlıdır?
  4. HashMap senkronizasyon yükünün olmaması nedeniyle tek iş parçacıklı bir ortamda genellikle daha hızlıdır.
  5. HashMap'i iş parçacığı açısından güvenli hale nasıl getirebilirsiniz?
  6. Kullanarak Collections.synchronizedMap() sarmak için HashMap veya kullanarak ConcurrentHashMap.
  7. Hashtable boş anahtarları veya değerleri saklayabilir mi?
  8. HAYIR, Hashtable boş anahtarlara veya değerlere izin vermez ve NullPointerException eğer teşebbüs edilirse.
  9. HashMap yerine Hashtable'ı ne zaman kullanmalısınız?
  10. Kullanmak Hashtable iş parçacığı güvenliği gerektiğinde ve senkronizasyonun performans yükünden endişe duymadığınızda.
  11. ConcurrentHashMap, Hashtable'a daha iyi bir alternatif midir?
  12. Evet, ConcurrentHashMap ile karşılaştırıldığında daha iyi eşzamanlılık ve performans sağlar Hashtable.
  13. HashMap neden iş parçacığı açısından güvenli değil?
  14. HashMap tek iş parçacıklı senaryolar için tasarlanmıştır ve senkronizasyon mekanizmalarını içermez.
  15. HashMap ve Hashtable çarpışmaları nasıl ele alıyor?
  16. İkisi birden HashMap Ve Hashtable Her bir paketin bağlantılı bir giriş listesi içerdiği zincirlemeyi kullanarak çarpışmaları yönetin.

HashMap ve Hashtable Üzerine Son Düşünceler

HashMap ve Hashtable, anahtar/değer çiftlerinin depolanmasında benzer amaçlara hizmet eder ancak senkronizasyon ve performansa yaklaşımları açısından önemli ölçüde farklılık gösterir. HashMap, null değerlerle hızı ve esnekliği nedeniyle iş parçacığı olmayan uygulamalar için tercih edilir. Bunun tersine, Hashtable iş parçacığı güvenli işlemler için uygundur ancak performansın maliyeti yüksektir. Geliştiriciler bu farklılıkları anlayarak, kendi özel gereksinimlerine göre hangi veri yapısını kullanacakları konusunda bilinçli kararlar alabilirler.