簡體   English   中英

HashSet 和 HashMap 的區別?

[英]Difference between HashSet and HashMap?

除了HashSet不允許重復值之外, HashMapHashSet之間有什么區別?

我的意思是實施明智? 這有點含糊,因為兩者都使用哈希表來存儲值。

HashSet 是一個集合,例如{1,2,3,4,5}

HashMap 是一個鍵 -> 值(鍵到值)映射,例如{a -> 1, b -> 2, c -> 2, d -> 1}

請注意,在我上面的示例中,HashMap 中不能有重復的鍵,但可以有重復的值。

在 HashSet 中,不能有重復的元素。

它們是完全不同的結構。 HashMapMap一個實現。 Map將鍵映射到值。 使用散列進行鍵查找。

另一方面, HashSetSet的實現。 集合旨在匹配集合的數學模型。 正如您所指出的, HashSet確實使用HashMap來支持其實現。 但是,它實現了一個完全不同的接口。

當您正在尋找最適合您的Collection ,本 教程是一個很好的起點。 如果你真的想知道發生了什么,也有一本書可以解決這個問題

哈希集

  1. HashSet 類實現了 Set 接口
  2. 在 HashSet 中,我們存儲對象(元素或值),例如,如果我們有一個字符串元素的 HashSet,那么它可以描述一組 HashSet 元素:{“Hello”、“Hi”、“Bye”、“Run”}
  3. HashSet 不允許重復元素,這意味着您不能在 HashSet 中存儲重復值。
  4. HashSet 允許有一個空值。
  5. HashSet 不是同步的,這意味着除非顯式同步,否則它們不適合線程安全操作。 [相似性]

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

哈希表

  1. HashMap 類實現了 Map 接口
  2. HashMap 用於存儲鍵值對。 簡而言之,它維護鍵和值的映射(HashMap 類大致等同於 Hashtable,除了它是不同步的並且允許空值。)如果 HashMap 元素具有整數鍵和 String 類型的值,則可以這樣表示:例如 {1->”Hello”, 2->”Hi”, 3->”Bye”, 4->”Run”}
  3. HashMap 不允許有重復的鍵,但它允許有重復的值。
  4. HashMap 允許單個空鍵和任意數量的空值。
  5. HashMap 不是同步的,這意味着除非顯式同步,否則它們不適合線程安全操作。 [相似性]

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

請參閱這篇文章以了解更多信息。

很遺憾他們的名字都以Hash開頭。 這是其中最不重要的部分。 正如其他人指出的那樣,重要的部分在Hash 之后- SetMap 它們分別是一個Set - 一個無序集合 - 和一個Map - 一個具有鍵控訪問的集合。 它們碰巧是用散列實現的——這就是名稱的來源——但它們的本質隱藏在它們名稱的那部分后面。

不要被他們的名字混淆; 它們是非常不同的東西。

Hashset內部實現HashMap 如果你看到內部實現,HashSet 中插入的值作為鍵存儲在 HashMap 中,該值是 Object 類的 Dummy 對象。
HashMap 與 HashSet 之間的區別是:-

  1. HashMap包含鍵值對,每個值都可以通過鍵訪問,因為 HashSet 每次都需要迭代,因為沒有 get 方法。
  2. HashMap實現了 Map 接口,允許一個空值作為鍵,多個空值作為值。而HashSet實現了 Set 接口,只允許一個空值,不能有重復值。(記住 HashMap 鍵中允許有一個空鍵,因此一個空值在 HashSet 中,因為 HashSet 在內部實現了 HashMap)。
  3. HashSetHashMap在迭代時不保持插入順序。

HashSet 允許我們在集合中存儲對象,而 HashMap 允許我們根據鍵和值存儲對象。 每個對象或存儲的對象都將具有密鑰。

Java中HashSet和HashMap的區別

1) HashMap 和 HashSet 的第一個也是最顯着的區別是 HashMap 是 Map 接口的實現,而 HashSet 是 Set 接口的實現,這意味着 HashMap 是基於鍵值的數據結構,HashSet 通過不允許重復來保證唯一性。實際上 HashSet 是 Java 中 HashMap 的包裝器,如果您查看 HashSet.java 的 add(E e) 方法的代碼,您將看到以下代碼:

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

其中將 Object 作為鍵和值放入 map 是一個最終對象 PRESENT ,它是虛擬的。

2) HashMap 和 HashSet 的第二個區別是,在 Java 中,我們使用 add() 方法將元素放入 Set 而我們使用 put() 方法將 key 和 value 插入到 HashMap 中。

3) HashSet 只允許一個空鍵,而 HashMap 可以允許一個空鍵+多個空值。

這就是 Java 中 HashSet 和 HashMap 之間的區別。 總之,HashSet 和 HashMap 是兩種不同類型的 Collection,一種是 Set,另一種是 Map。

Java中HashSet和HashMap的區別

HashSet 內部使用 HashMap 來存儲對象。當調用 add(String) 方法時,它調用 HahsMap put(key,value) 方法,其中 key=String object & value=new Object(Dummy)。所以它不保持重復,因為鍵只是值目的。

作為鍵存儲在 Hashset/HashMap 中的對象應該覆蓋 hashcode & equals 合同。

用於訪問/存儲 HashMap 中的值對象的鍵應聲明為 Final,因為當它被修改時,值對象無法定位並返回 null。

顧名思義, HashMap是一個關聯Map (從鍵到值的映射), HashSet只是一個Set

HashMap用於添加、獲取、刪除...由任何類型的自定義鍵索引的對象。
HashSet用於添加元素,刪除元素並通過比較它們的哈希來檢查元素是否存在。

所以 HashMap 包含元素,而 HashSet 記住它們的哈希值。

區別:關於層次結構:HashSet 實現了 Set。 HashMap 實現 Map 並存儲鍵和值的映射。

在數據庫方面使用 HashSet 和 HashMap 將幫助您理解每個的重要性。
HashSet:一般用於存儲唯一的集合對象。 例如:它可以用作存儲之間的多對一關系的實現類
class Item 和 Class Bid where (Item has many Bids) HashMap:用於將鍵映射到值。值可以是 null 或任何對象/對象列表(本身就是對象)。

HashSet是根據HashMap 實現的 它是鍵和 PRESENT 對象之間的映射。

HashSet 在內部使用 HashMap 來存儲其條目。 內部 HashMap 中的每個條目都以單個對象為鍵,因此所有條目都散列到同一個桶中。 我不記得內部 HashMap 使用什么來存儲其值,但這並不重要,因為該內部容器永遠不會包含重復值。

編輯:為了解決馬修的評論,他是對的; 我把它倒過來了。 內部 HashMap以構成 Set 元素的 Object為鍵。 HashMap 的值是一個對象,它只是簡單地存儲在 HashMap 存儲桶中。

HashMap是一個Map實現,允許重復值不允許重復鍵。 . 要添加對象,需要鍵/值對。 允許空鍵和空值。 例如:

{The->3,world->5,is->2,nice->4}

HashSet是一個Set實現,它不允許重復。如果你試圖添加一個重復的對象,調用public boolean add(Object o)方法,那么 set 保持不變並返回false 例如:

[這個,世界,很好]

HashSet 和 HashMap 都存儲對,不同之處在於在 HashMap 中可以指定一個鍵,而在 HashSet 中,鍵來自對象的哈希碼

HashMaps允許一個空鍵和一個空值。 它們不同步,從而提高了效率。 如果需要,您可以使用Collections.SynchronizedMap()使它們同步

Hashtables不允許空鍵並且是同步的。

你幾乎回答了你自己的問題——hashset 不允許重復值。 使用后備哈希映射構建哈希集將是微不足道的(並且只是檢查該值是否已經存在)。 我猜各種 java 實現要么這樣做,要么實現一些自定義代碼以更有效地做到這一點。

您可以找到它們之間的主要區別如下:

哈希集

  • 它不允許重復的鍵。
  • 即使它沒有同步,所以這將有更好的性能。
  • 它允許空鍵。
  • 當你想維護一個唯一的列表時,可以使用 HashSet。
  • HashSet 實現了 Set 接口,它由哈希表(實際上是 HashMap 實例)支持。
  • HashSet 存儲對象。
  • HashSet 不允許重復元素,但允許空值。
  • 此接口不保證訂單會隨着時間的推移保持不變。

哈希表

  • 它允許重復鍵。 它不是同步的,所以這會有更好的性能。
  • HashMap 不維護插入順序。
  • 順序由哈希函數定義。
  • 它不是線程安全的
  • 它允許鍵和值都為 null。
  • 它允許一個空鍵和任意數量的空值。
  • HashMap 是 Map 接口的基於哈希表的實現。
  • HashMap 將對象存儲為鍵值對。
  • HashMap 不允許重復鍵,但允許空鍵和值。
  • 元素的排序不能保證超時。

基本上在 HashMap 中,用戶必須同時提供 Key 和 Value,而在 HashSet 中,您只提供 Value,Key 是通過使用哈希函數從 Value 自動派生的。 所以有了Key和Value后,HashSet內部就可以存儲為HashMap了。

HashMap 是 Map 接口的實現 HashSet 是 Set 接口的實現

HashMap 以鍵值對的形式存儲數據 HashSet 只存儲對象

put方法用於在map中添加元素Add方法用於添加元素是Set

在哈希映射中,使用鍵對象計算哈希碼值這里的成員對象用於計算兩個對象可以相同的哈希碼值,因此 equal() 方法用於檢查相等性,如果它返回 false,這意味着兩個對象不同。

HashMap 比 hashset 快,因為使用唯一鍵訪問對象 HashSet 比 Hashmap 慢

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM