![](/img/trans.png)
[英]What is the main difference between LinkedList, HashSet and HashMap?
[英]Difference between HashSet and HashMap?
除了HashSet
不允許重復值之外, HashMap
和HashSet
之間有什么區別?
我的意思是實施明智? 這有點含糊,因為兩者都使用哈希表來存儲值。
HashSet 是一個集合,例如{1,2,3,4,5}
HashMap 是一個鍵 -> 值(鍵到值)映射,例如{a -> 1, b -> 2, c -> 2, d -> 1}
請注意,在我上面的示例中,HashMap 中不能有重復的鍵,但可以有重復的值。
在 HashSet 中,不能有重復的元素。
它們是完全不同的結構。 HashMap
是Map
一個實現。 Map將鍵映射到值。 使用散列進行鍵查找。
另一方面, HashSet
是Set
的實現。 集合旨在匹配集合的數學模型。 正如您所指出的, HashSet
確實使用HashMap
來支持其實現。 但是,它實現了一個完全不同的接口。
當您正在尋找最適合您的Collection
,本 教程是一個很好的起點。 如果你真的想知道發生了什么,也有一本書可以解決這個問題。
HashSet 不是同步的,這意味着除非顯式同步,否則它們不適合線程安全操作。 [相似性]
add contains next notes HashSet O(1) O(1) O(h/n) h is the table
HashMap 不是同步的,這意味着除非顯式同步,否則它們不適合線程安全操作。 [相似性]
get containsKey next Notes HashMap O(1) O(1) O(h/n) h is the table
請參閱這篇文章以了解更多信息。
很遺憾他們的名字都以Hash開頭。 這是其中最不重要的部分。 正如其他人指出的那樣,重要的部分在Hash 之后- Set和Map 。 它們分別是一個Set - 一個無序集合 - 和一個Map - 一個具有鍵控訪問的集合。 它們碰巧是用散列實現的——這就是名稱的來源——但它們的本質隱藏在它們名稱的那部分后面。
不要被他們的名字混淆; 它們是非常不同的東西。
Hashset
內部實現HashMap
。 如果你看到內部實現,HashSet 中插入的值作為鍵存儲在 HashMap 中,該值是 Object 類的 Dummy 對象。
HashMap 與 HashSet 之間的區別是:-
HashMap
包含鍵值對,每個值都可以通過鍵訪問,因為 HashSet 每次都需要迭代,因為沒有 get 方法。HashMap
實現了 Map 接口,允許一個空值作為鍵,多個空值作為值。而HashSet
實現了 Set 接口,只允許一個空值,不能有重復值。(記住 HashMap 鍵中允許有一個空鍵,因此一個空值在 HashSet 中,因為 HashSet 在內部實現了 HashMap)。HashSet
和HashMap
在迭代時不保持插入順序。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 實現要么這樣做,要么實現一些自定義代碼以更有效地做到這一點。
您可以找到它們之間的主要區別如下:
哈希集
哈希表
基本上在 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.