HashSet ve HashMap arasındaki fark nedir?


168

Aslında dışında HashSetyinelenen değerleri izin vermez, arasındaki fark nedir HashMapve HashSet?

Yani uygulama akıllıca mı? Her ikisi de değerleri saklamak için karma tabloları kullandığından biraz belirsiz .


HashSet, HashMap kullanılarak uygulanmaktadır
therealprashant

HashSet'in neden ArrayList'ten farklı olduğunu bilmek, yukarıdaki sorunuzun cevabını anlamanıza yardımcı olacaktır: stackoverflow.com/questions/18706870/…
djangofan

Yanıtlar:


150

Bunlar tamamen farklı yapılardır. A HashMap, bir uygulamasıdır Map. A Harita değerlerine anahtarlarını eşler. Anahtar arama karma kullanılarak yapılır.

Öte yandan, a HashSetbir uygulamasıdır Set. Bir Seti kümesinin matematiksel bir model eşleştirmek için tasarlanmıştır. A HashSet, HashMapbelirttiğiniz gibi, uygulamasını desteklemek için a kullanır . Ancak, tamamen farklı bir arayüz uygular.

Amacınız için en iyi olanı arıyorsanız Collection, bu Eğitici iyi bir başlangıç ​​yeridir. Eğer gerçekten neler olduğunu bilmek istiyorsanız, bunun için de bir kitap var .


Bu ifade biraz basit. Kapakların altında daha fazlası var, "" Belirtilen nesne için bir karma değer döndürür. Nesnenin kendi hashCode'una ek olarak, bu yöntem düşük kaliteli hash fonksiyonlarına karşı savunan bir "tamamlayıcı hash fonksiyonu" uygular . HashMap iki uzunluklu karma tabloların gücünü kullandığından bu önemlidir. " Weblogs.java.net/blog/2005/06/18/hashmap-implementation - ancak, dokümana bakarsanız, bu karma öğenin bir şeyler dağıttığını görürsünüz. "kovalar" ın üzerinde, bu yüzden sonunda iki şeyin aynı kovaya eşleştirilebileceğine inanıyorum.
justkt

1
İkinci sorunuza cevap vermek için - hayır. @Bruno Rothgiesser'ın mükemmel cevabı tarafından tanımlandığı şekliyle (anahtar -> değer) bir harita. Bir küme, yinelenmeyen öğeler içindir. Anahtar-> değer değil yinelenenleri istiyorsanız, bir java.util.List uygulamasını kontrol ediyorum. : Kesin rehberi Koleksiyon öğretici kontrol edin java.sun.com/docs/books/tutorial/collections/index.html
justkt

@justk: evet, bir kovada iki anahtar alabilirsiniz ve daha sonra aralarında ayrım yapmak için equals () kullanılır. Bu nedenle hashCode () ve equals () uyumlu olmalıdır.
Michael Borgwardt

6
@SpikETidE: Ne HashMap ne de HashSet kopyalara izin vermez. Bütün mesele bu.
Michael Borgwardt

23
@SpikETidE: Bir kümenin anahtar / değer çiftleri değil, yalnızca öğeleri vardır. HashSet, set öğeleri anahtar olarak ve yok sayılan değerle birlikte bir HashMap'a sahip olarak uygulanır.
Michael Borgwardt

300

HashSet bir olan dizi , örneğin {1,2,3,4,5}

HashMap bir anahtar -> değer ( değerin anahtarı) haritasıdır, örneğin {a -> 1, b -> 2, c -> 2, d -> 1}

Yukarıdaki örneğimde, HashMap'te yinelenen anahtarların olmaması gerektiğine, ancak yinelenen değerlere sahip olabileceğine dikkat edin.

HashSet'te, yinelenen öğe olmamalıdır.


Ancak karışıklığın (en ilginç) nedeni HashSet'te bile öğelere erişmek için bir "anahtara" ihtiyacınız olmasıdır. Yani, matematikte bile nesneler, erişilecek veya referans verilecek isimlere (veya adreslere) sahiptir. Bu gerçek anlamda bir HashSet, öğelerinin isimleri (veya adresleri) ile anahtarlanan özellikle basit bir HashMap'tır.
Andrew Marshall

65

HashSet

  1. HashSet sınıfı Set arabirimini uygular
  2. HashSet'te, nesneleri (elemanları veya değerleri) depolarız, örneğin bir StringSet dizesi elemanlarımız varsa, bir dizi HashSet öğesini tasvir edebilir: {“Merhaba”, “Merhaba”, “Güle”, “Çalıştır”}
  3. HashSet, yinelenen değerleri HashSet'te depolayamayacağınız anlamına gelen yinelenen öğelere izin vermez.
  4. HashSet, tek bir boş değere sahip olmasına izin verir.
  5. HashSet senkronize edilmediğinden, açıkça senkronize olmadıkça iş parçacığı için güvenli işlemler için uygun olmadıkları anlamına gelir. [Benzerlik]

                          add      contains next     notes
    HashSet               O(1)     O(1)     O(h/n)   h is the table 

HashMap

  1. HashMap sınıfı Harita arayüzünü uygular
  2. HashMap anahtar ve değer çiftlerini saklamak için kullanılır. Kısacası, anahtar ve değer eşlemesini korur (HashMap sınıfı, senkronize edilmemesi ve null değerlere izin vermesi dışında kabaca Hashtable ile eşdeğerdir.) Tamsayı anahtarı ve String türünün değeri varsa HashMap öğelerini şu şekilde temsil edebilirsiniz: ör. {1 -> ”Merhaba”, 2 -> ”Merhaba”, 3 -> ”Hoşçakal”, 4 -> ”Koş”}
  3. HashMap yinelenen anahtarlara izin vermez, ancak yinelenen değerlere sahip olmasına izin verir.
  4. HashMap tek null anahtarına ve herhangi bir sayıda null değere izin verir.
  5. HashMap senkronize edilmez, yani açıkça senkronize olmadıkça iş parçacığı için güvenli işlemler için uygun olmadıkları anlamına gelir. [Benzerlik]

                           get      containsKey next     Notes
     HashMap               O(1)     O(1)        O(h/n)   h is the table 

Daha fazla bilgi için lütfen bu makaleye bakın .


36

Her iki isminin de Hash ile başlaması gerçekten utanç verici . Bu onların en az önemli kısmı. Önemli parçaları sonra gelen Hash - Set ve Harita Diğerleri işaret olarak. Sırasıyla, bir Set - sırasız bir koleksiyon - ve bir Harita - anahtar erişimli bir koleksiyon. Karmalarla birlikte gerçekleşiyorlar - isimlerin geldiği yer bu - ama özleri isimlerinin o kısmının arkasında gizleniyor.

İsimleriyle karıştırmayın; onlar çok farklı şeyler.


@HiteshSahu İkisi de Hash Tables ( en.wikipedia.org/wiki/Hash_table ) ile uygulanır. Bu, doğru şekilde verimli bir seti temsil etmek için iyi bir veri yapısıdır ve esasen bir HashMap'in anahtarları HashSet olarak uygulanır. Bu yüzden onları kim isimlendirirse, onları uygulamak için bazı sıkıntılar yaşadı ve amaçlarından ziyade uygulamaya odaklandı (tahminte).
Carl Manaster

1
İyi açıkladı. Teşekkür ederim.
user3932000

5

HashsetDahili olarak uygular HashMap. Dahili uygulamayı görürseniz HashSet'e eklenen değerler HashMap'te anahtar olarak saklanır ve değer Object sınıfının bir Dummy nesnesidir.
HashMap vs HashSet arasındaki fark: -

  1. HashMap anahtar / değer çiftlerini içerir ve her değere anahtarla erişilebilir; burada HashSet, get yöntemi olmadığı için her seferinde yinelenmelidir.
  2. HashMapHarita arabirimini uygular ve anahtar olarak bir null değere ve değer olarak birden çok null değere HashSetizin verir. HashSet, HashMap'i dahili olarak uygular).
  3. HashSetve HashMapyineleme sırasında ekleme sırasını korumaz.

3

HashSet, kümedeki nesneleri depolamamıza izin verir; burada HashMap, nesneleri anahtar ve değer temelinde depolamamıza izin verir. Her nesnenin veya saklanan nesnenin anahtarı olacaktır.


2

İsimleri ima olarak, bir HashMap bir ilişkisel olan Harita a, (bir değere anahtarından haritalama) HashSet sadece olduğunu belirle .


2
@SpikETidE Bu, benzersizliğin nasıl uygulandığının bir ayrıntısıdır, ancak HashSet'in anlamı bir küme uygulamaktır.
Michael Borgwardt

1
yani .. tüm "çoğaltmak istemiyorsanız hashSet kullanın ... yinelenen hakkında rahatsız değilseniz HashMap kullanın" .... aşağı kaynar.
SpikETidE

3
Java, "potansiyel olarak çoğaltılan öğeleri içeren bir koleksiyon" ("torba") için belirli bir sınıf uygulamıyorsa, bunun için bir Liste kullanabilirsiniz (ancak bir Liste torbaya: semantik bir anlam ekler; ancak bunu yok sayabilirsiniz).
leonbloy

2

Java'da HashSet ve HashMap arasındaki farklar

1) HashMap ve HashSet arasındaki ilk ve en önemli fark, HashMap'ın Harita arayüzünün bir uygulaması olması, HashSet ise Set arayüzünün bir uygulamasıdır, yani HashMap anahtar değere dayalı bir veri yapısıdır ve HashSet, kopyalara izin vermeyerek benzersizliği garanti eder. gerçeklik HashSet, Java'da HashMap etrafında bir sarıcıdır, HashSet.java'nın add (E e) yönteminin koduna bakarsanız aşağıdaki kodu göreceksiniz:

public boolean add(E e) 
{
    return map.put(e, PRESENT)==null;
}

burada nesnenin anahtar ve değer olarak haritaya konulması, kukla olan son bir nesildir.

2) HashMap ve HashSet arasındaki ikinci fark, öğeleri Set içine koymak için add () yöntemini kullanmak, ancak Java'da HashMap'e anahtar ve değer eklemek için put () yöntemini kullanmaktır.

3) HashSet yalnızca bir null anahtara izin verir, ancak HashMap bir null anahtara + birden fazla null değere izin verebilir.

Tüm bunlar Java'daki HashSet ve HashMap arasındaki farktır. Özetle HashSet ve HashMap biri biri diğeri Harita olmak üzere iki farklı Koleksiyon tipidir.


2

Java'da HashSet ve HashMap arasındaki farklar

HashSet, objects.when add (String) yöntemini çağırdığında HMHMM put (key, value) yöntemini çağırdığı durumlarda HashMap'i dahili olarak kullanır. Burada key = String object & value = new Object (Dummy). Nesne.

Hashset / HashMap içinde anahtar olarak saklanan Nesneler, hashcode & eşittir sözleşmesini geçersiz kılmalıdır.

HashMap'te değer nesnelerine erişmek / depolamak için kullanılan anahtarlar, değiştirildiği zaman Value nesnesi bulunamıyor ve null değerini döndürdüğü için Son olarak bildirilmelidir.


1

A HashMap, herhangi bir türden özel bir anahtarla dizine eklenmiş nesneleri almak, kaldırmak, kaldırmaktır.
A HashSeteleman eklemek, eleman çıkarmak ve elemanların karmasını karşılaştırarak var olup olmadığını kontrol etmektir.

Yani bir HashMap öğeleri içerir ve bir HashSet kendi karmalarını hatırlar.


1
Karmalarını karşılaştırarak ve equals()yöntemlerini çağırarak .
Lorne Marquis

1

Farklılıklar: heirarchy açısından: HashSet Set uygular. HashMap Harita'yı uygular ve anahtarların ve değerlerin bir eşlemesini saklar.

Veritabanı ile ilgili HashSet ve HashMap kullanımı, her birinin önemini anlamanıza yardımcı olacaktır.
HashSet: genellikle benzersiz toplama nesnelerini saklamak için kullanılır. Örneğin:
Sınıf Öğesi ve Sınıf Teklifi arasında birden fazla bire bir ilişki gemisi depolamak için uygulama sınıfı olarak kullanılabilir; burada (Öğenin birçok Teklifi vardır) HashMap: bir anahtarı değere eşlemek için kullanılır. Değer null veya herhangi bir Nesne olabilir / nesnenin listesi (kendi içinde nesne).



0

HashSet, girdilerini depolamak için dahili olarak bir HashMap kullanır. Dahili HashMap'teki her giriş tek bir Nesne tarafından anahtarlanır, böylece tüm girişler aynı grupta toplanır. Dahili HashMap'in değerlerini saklamak için ne kullandığını hatırlamıyorum, ancak bu dahili kap asla yinelenen değerler içermeyeceği için gerçekten önemli değil.

DÜZENLEME : Matthew'nin yorumuna hitap etmek için haklı; Geri aldım. Dahili HashMap, Set öğelerini oluşturan Nesneler ile anahtarlanır . HashMap değerleri, sadece HashMap bölümlerinde saklanan bir Nesnedir.


Bu doğru değil. Ayarlanan elemanlar doğrudan HashMap tuşları olarak kullanılır.
Matthew Flaschen

0

HashMapyinelenen değerlereMap izin veren ancak yinelenen anahtarlara izin vermeyen bir uygulamadır . . Bir nesne eklemek için bir Anahtar / Değer çifti gereklidir. Null Tuşlar ve Null değerlere izin verilir. Örneğin:

{The-> 3, dünya> 5, IS-> 2, güzel-> 4}

HashSetYinelenenlere izinSet vermeyen bir uygulamadır . Yinelenen bir nesne, yönteme çağrı eklemeyi denediyseniz , küme değişmeden kalır ve geri döner . Örneğin:public boolean add(Object o)false

[, Dünya, güzel,]


-1

kendi sorunuzu hemen hemen cevapladınız - hashset yinelenen değerlere izin vermiyor. destek hashmap'i (ve değerin zaten var olup olmadığını görmek için bir kontrol) kullanarak bir karma kümesi oluşturmak önemsiz olacaktır. çeşitli java uygulamaları ya bunu yapmak ya da daha verimli yapmak için bazı özel kod uygulamak sanırım.


1
@oedo - java.util.HashSetbunun a tarafından desteklendiğini söylüyor java.util.HashMap.
justkt

2
Kopyalara izin vermemek aralarında bir fark değildir.
Lorne Marquis

-1

Temelde HashMap'te, kullanıcı hem Anahtar hem de Değer sağlamalıdır, oysa HashSet'te yalnızca Değer sağlarsanız, Anahtar hash işlevini kullanarak otomatik olarak Değer'den türetilir. Bu nedenle, hem Key hem de Value'e sahip olduktan sonra, HashSet dahili olarak HashMap olarak saklanabilir.


Anahtar , bir HashSet içindeki değerdir.
Lorne Marquis

-1

HashSet ve HashMap her iki depo çiftinde, fark HashMap'te bir anahtar belirtebildiğinizde, HashSet'te anahtar nesnenin hash kodundan gelir.


Bu doğruysa, HashSet aynı hashCode ile birden fazla nesne depolayamadı ve içeriyor.
Lorne Marquis

-1

HashMapsbir null anahtar ve null değerine izin ver. Senkronize edilmezler, bu da verimliliği artırır. Gerekirse, bunları kullanarak senkronize edebilirsiniz.Collections.SynchronizedMap()

Hashtables null anahtarlara izin verme ve senkronize etme.


Abut Hashtables'a sormadı. Soruya cevap vermiyor.
Lorne Marquis

-2

HashMap Harita arabiriminin bir uygulamasıdır HashSet Set Arabiriminin bir uygulamasıdır

HashMap Verileri anahtar değer çifti biçiminde depolar HashSet Yalnızca nesneleri depolar

Haritaya öğe eklemek için koyma yöntemi kullanılır.

Karma eşlemede karma kod değeri anahtar nesne kullanılarak hesaplanır Burada üye nesne, iki nesne için aynı olabilecek karma kod değerini hesaplamak için kullanılır; bu nedenle, iki nesnenin farklı olduğu anlamına gelen yanlış döndürürse eşitliği kontrol etmek için equal () yöntemi kullanılır.

HashMap, hashsetten daha hızlıdır çünkü nesneye erişmek için benzersiz anahtar kullanılır HashSet, Hashmap'den daha yavaştır


1
Aslında aynı performansa sahiptirler ve 'benzersiz anahtar kullanıldığından' yanlıştır.
Lorne Marquis
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.