hashset java 键值对_Java集合 - HashSet的定义以及用法
HashSet的定義
HashSet類實現了Set接口,由一個實際上是HashMap實例的散列表?支持。不能保證該集合的迭代次序,這意味著該類不能保證元素隨時間的不變順序。這個類允許null元素。該類還為基本操作(如添加,刪除,包含和大小)提供了恒定的時間性能,假定散列函數將元素正確地分散到桶中,我們將在文章中進一步討論。
HashSet的一些重要特性是:
- 實現Set Interface。
- HashSet的基礎數據結構是散列表。
- 由于它實現了Set Interface,所以不允許重復值。
- 您在HashSet中插入的對象不保證以相同順序插入。對象基于其哈希碼插入。
- HashSet中允許使用NULL元素。
- HashSet還實現了Searlizable和Cloneable接口。
現在為了維持恒定的時間性能,迭代HashSet需要的時間與HashSet實例的大小(元素數量)加上支持HashMap實例的“容量”(桶的數量)的總和成正比。因此,如果迭代性能很重要,不要將初始容量設置得太高(或者負載因子太低)是非常重要的。
初始容量:初始容量意味著在創建散列表(HashSet內部使用散列表數據結構)時創建桶的數量。如果當前尺寸變滿,桶的數量將自動增加。負載因數:負載因數是衡量HashSet在其容量自動增加之前能夠獲得的滿量程。當哈希表中的條目數量超過負載因子和當前容量的乘積時,散列表就會被重新映射(即重建內部數據結構),以便散列表大約是存儲桶數量的兩倍。
表格中存儲的元素數量 加載因子= -----------------------------------------????????????????????????散列表的大小?示例:如果內部容量為16并且加載因子為0.75,那么當表中有12個元素時,桶的數量會自動增加。
對性能的影響:
負載因子和初始容量是影響HashSet操作性能的兩個主要因素。0.75的負載因子在時間和空間復雜度方面提供了非常有效的性能。如果我們將負載因子值增加得超過這個值,那么內存開銷將會減少(因為它會減少內部重建操作),但是它會影響哈希表中的添加和搜索操作。為了減少重新哈希操作,我們應該明智地選擇初始容量。如果初始容量大于最大入口數量除以負載因子,則不會發生重新刷新操作。
注:HashSet中的實現不同步,因為如果多個線程同時訪問散列集,并且至少有一個線程修改了該集,它必須在外部同步。這通常是通過在自然封裝集合的某個對象上進行同步來完成的。如果不存在這樣的對象,則應該使用Collections.synchronizedSet方法來“包裝”該集合。這最好在創建時完成,以防止意外的不同步訪問集合,如下所示:
Set s = Collections.synchronizedSet(new HashSet(...));HashSet中的構造函數:
默認初始容量為16,默認加載因子為0.75。
默認的0.75的loadFactor
下面的程序說明了HashSet的幾個基本操作:
// Java program to demonstrate working of HashSet
import java.util.*;
class Test
{
public static void main(String[]args)
{
HashSet h = new HashSet();
// Adding elements into HashSet usind add()
h.add("India");
h.add("Australia");
h.add("South Africa");
h.add("India");// adding duplicate elements
// Displaying the HashSet
System.out.println(h);
System.out.println("List contains India or not:" +
h.contains("India"));
// Removing items from HashSet using remove()
h.remove("Australia");
System.out.println("List after removing Australia:"+h);
// Iterating over hash set items
System.out.println("Iterating over list:");
Iterator i = h.iterator();
while (i.hasNext())
System.out.println(i.next());
}
}
輸出:
[South Africa, Australia, India]List contains India or not:trueList after removing Australia:[South Africa, India]Iterating over list:South AfricaIndiaHashSet的內部工作
由Map內部備份的所有Set接口類。HashSet使用HashMap在內部存儲它的對象。您一定想知道,要在HashMap中輸入值,我們需要一個鍵值對,但在HashSet中,我們只傳遞一個值。
存儲在HashMap中
實際上,我們在HashSet中插入的值作為映射對象的關鍵字,并且其值java使用常量變量。所以在鍵值對中,所有鍵都具有相同的值。
在java文檔中實現HashSet:
private transient HashMap map;//構造函數 - 1//所有的構造函數都在內部創建HashMap對象。public HashSet(){ //創建內部支持HashMap對象 map = new HashMap();}//構造函數 - 2public HashSet(int initialCapacity){ //創建內部支持HashMap對象 map = new HashMap(initialCapacity);}//與map中的對象關聯的虛擬值private static final Object PRESENT = new Object();如果我們看一下HashSet類的add()方法:
public boolean add(E e){ return map.put(e,PRESENT)== null;}我們可以注意到,HashSet類的add()方法通過傳遞指定的元素作為鍵和常量“PRESENT”作為其值,來內部調用支持HashMap對象的put()方法。
remove()方法也以相同的方式工作。它內部調用Map接口的remove方法。
public boolean remove(Object o){??return map.remove(o)== PRESENT;}HashSet操作的時間復雜度:HashSet的基礎數據結構是散列表。因此,對于添加,移除和查找(包含方法)操作,HashSet需要O(1)次的時間復雜度(平均或通常情況下)的時間復雜度。
HashSet中的方法:
--------------------------------------------------------
轉載自:https://www.breakyizhan.com/java/4658.html
總結
以上是生活随笔為你收集整理的hashset java 键值对_Java集合 - HashSet的定义以及用法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java线上问题定位_java定位线上问
- 下一篇: 重定向地址_JavaWeb - Serv