Yeni bir bilgisayar dili öğrendiğinizde, sormaya başladığınız ilk şeylerden biri büyük veri gruplarıyla nasıl çalışılacağıdır. Bu konu genellikle “Veri Yapıları” başlığı altında ele alınmaktadır. Daha derine inerseniz, diğer birçok veri yapısı arasında bağlantılı listeler, kuyruklar, yığınlar ve ikili ağaçlar gibi konular etrafında gelmelisiniz. Java'da bu yapılar Java Koleksiyon Çerçevesinin bir parçasıdır. Bir koleksiyon, birden çok veri öğesinin gruplanmasını ifade eden bir tür veri yapısından başka bir şey değildir ve Java Koleksiyonlar Çerçevesi, bu nesne gruplarının işlenme biçimini standartlaştırır. Aslında, koleksiyon çerçevesi çeşitli hedefleri karşılamak için tasarlanmıştır.
Tüm koleksiyon çerçevesi bir dizi standart arayüz etrafında tasarlanmıştır. LinkedList, HashSet ve TreeSet gibi çeşitli standart uygulamalar, bu arayüzlerle olduğu gibi sağlar. Ayrıca, isterseniz kendi koleksiyonunuzu da uygulayabilirsiniz. Bununla birlikte, koleksiyonlara ek olarak, çerçeve birkaç harita arayüzü ve sınıfı tanımlar. Java, anahtar / değer çiftlerini depolayan üç genel amaçlı harita uygulaması içerir - HashMap, TreeMap ve LinkedHashMap. Haritalar teknik olarak koleksiyon olmasa da, koleksiyonlarla tamamen entegredir. Aslında, haritalar nesneler arasındaki ilişki gruplarına odaklanır. Bu makalede HashMap ve HashSet arasındaki temel farklar özetlenmektedir.
HashMap, öğelerin sırasız olduğu temel bir anahtar / değer haritası sağlayan Harita arayüzünün en sık kullanılan uygulamasıdır. Anahtarın yavaş araması yerine karma kodu adı verilen özel bir değer kullanır. Karma kodu, söz konusu nesnede bilgi almanın ve bu nesne için “nispeten benzersiz” int haline getirmenin bir yoludur. Sadece hash ilkesi üzerinde çalışır, yani tanımlayıcı değerleri haritalamak için bir hash fonksiyonu kullanır. Vector ve Stack'in yerine ArrayList ve LinkedList'te olduğu gibi Hashtable'ın da HashMap'te bir yedeği vardır. Dahili bir Hashtable temsili kullanarak Harita arabirimini uygulamak için AbstractMap'i genişletir. Ve diğer genel amaçlı uygulamalara benzer şekilde, HashMap isteğe bağlı Harita yöntemlerini destekler, boş değerlere izin verir ve senkronize edilmez.
HashSet, aslında bir HashMap örneği olan bir karma tablosu ile desteklenen Set arabirimini uygulayan Java Collections Framework üyelerinden biridir. Adından da anlaşılacağı gibi, öğelerin içeriklerinden türetilmiş bir konumda saklandığı bir dizi olan bir karma tablosu tarafından uygulanır. Bir Harita'nın aksine, Set tam olarak aynı arayüze sahip bir Koleksiyon, bu nedenle iki farklı Listede olduğu gibi ekstra bir işlevsellik yok. HashSet, hızlı aramalar için özel olarak tasarlanmış bir karma işlevini kullanır. Yinelenen değerleri depolayamayan benzersiz nesnelerin sıralanmamış bir koleksiyonudur. HashSet, Set arabirimini uygulayan AbstractSet sınıfını genişletir. Ancak HashSet, üst sınıfları ve arayüzleri tarafından sağlananlar dışında herhangi bir ek yöntem tanımlamaz.
HashMap, öğelerin sırasız olduğu temel bir anahtar / değer haritası sağlayan Harita arayüzünün en sık kullanılan uygulamasıdır. Sadece hash ilkesi üzerinde çalışır, yani tanımlayıcı değerleri haritalamak için bir hash fonksiyonu kullanır. HashSet ise, aslında bir HashMap örneği olan bir karma tablosu ile desteklenen Set arabirimini uygulayan Java Collections Framework üyelerinden biridir. Basitçe söylemek gerekirse, HashMap Harita arayüzünü uygularken, HashSet Set arayüzünü uygular.
HashSet, depolama için bir karma tablo kullanan bir koleksiyon oluşturur. Karma tablosu, hashing adı verilen bir yöntemi kullanarak bilgileri depolar. HashSet, öğeleri veya değerleri depolamak için hızlı aramalar için özel olarak tasarlanmış bir karma işlevi kullanır. HashSet işlevlerinin çoğu, HashSet'in TreeSet ile paylaştığı AbstractCollection ve AbstractSet üst sınıfı aracılığıyla sağlanır. HashMap, dahili bir Hashtable gösterimi kullanarak Harita arabirimini uygulamak için AbstractMap'i genişletir. Her iki sınıf da senkronize değildir, yani iş parçacığı için güvenli işlemler için uygun değildir.
Harita yinelenen anahtarları desteklemediğinden, HashMap yinelenen anahtarlara izin vermez, ancak yinelenen değerlere izin verilir. Bu, HashMap'te yinelenen değerlerin olabileceği anlamına gelir, ancak koleksiyonu bazı anahtarlara karşı değer olarak kullanabilirsiniz. Her anahtar HashMap'te benzersiz olmalıdır ve tek bir anahtarın 1'den fazla değere sahip olmasına izin verilmez. Öte yandan HashSet, yalnızca bir Set tanımıyla yinelenen öğelere sahip olamaz, bu da yinelenen değerleri HashSet'te depolayamayacağınız anlamına gelir. HashMap yalnızca bir null anahtara izin verir, ancak herhangi bir sayıda null değere izin verirken HashSet yalnızca bir null değere izin verir.
HashMap karma prensibi üzerinde çalışır, yani kolay geri almayı sağlamak için karma algoritmasını kullanarak değerleri dahili olarak tanımlamak için bir karma fonksiyonu kullanır. Gerçek bir karma mekanizması, aynı nesneye uygulandığında her zaman aynı hashCode () öğesini döndürür. HashSet ise, nesneleri eklemek veya saklamak için dahili olarak HashMap'i destek veri yapısı olarak kullanır. Bu, HashSet nesnesi oluşturulduğunda, HashMap nesnesini oluşturacağı anlamına gelir.
Hem HashMap hem de HashSet senkronize olmasalar da, iş parçacığı için güvenli işlemler için uygun olmadıkları ve tamamen farklı yapılar oldukları halde, eleman ekleme, çıkarma gibi temel işlemler için sabit zaman performansı sağlarlar. HashMap, genel amaçlı bir uygulamadır anahtar / değer çiftlerini saklayan Harita arayüzü HashSet, Set arayüzünün bir uygulamasıdır. Bir HashSet, uygulamasını desteklemek için bir HashMap kullanır. Bununla birlikte, bir HashMap karma prensibini kullanır ve anahtarı hızlı bir şekilde avlamak için kullanır.