哈希表存放的是哈希值, HashSet 存儲元素的順序并不是按照存入時的順序(和 List 顯然不同) 而是按照哈希值來存的所以取數據也是按照哈希值取得。
~
本篇內容包括:HashSet 概述、HashSet 與 HashMap 的關系以及HashSet 的使用
文章目錄
- 一、HashSet 概述
- 二、HashSet 與 HashMap
- 三、HashSet 的使用
- 1、構造方法
- 2、常用方法
一、HashSet 概述
哈希表存放的是哈希值, HashSet 存儲元素的順序并不是按照存入時的順序(和 List 顯然不同) 而是按照哈希值來存的所以取數據也是按照哈希值取得。元素的哈希值是通過元素的 hashcode 方法來獲取的, HashSet 首先判斷兩個元素的哈希值,如果哈希值一樣,接著會比較 equals 方法 如果 equls 結果為 true , HashSet 就視為同一個元素。如果 equals 為 false 就不是同一個元素。哈希值相同 equals 為 false 的元素是怎么存儲呢,就是在同樣的哈希值下順延(可以認為哈希值相同的元素放在一個哈希桶中)。也就是哈希一樣的存一列。
HashSet 通過 hashCode 值來確定元素在內存中的位置。一個 hashCode 位置上可以存放多個元素。
HashSet 的底層源碼特別少,主要是因為 HashSet 的方法基本都是借助 HashMap 的方法來實現的。
HashSet 存儲的元素對應 HashMap 的 key,因為 HashMap 不能存儲重復的 key,所以 HashSet 不能存放重復元素;由于 HashMap 的 key 是基于 hashCode 存儲對象的,所以 HashSet 中存放的對象也是無序的;HashSet 也沒有提供 get 方法,可以通過 Iterator 迭代器獲取數據。
二、HashSet 與 HashMap
HashSet 是基于 HashMap 實現的,區別就在于在 HashMap 中輸入一個鍵值對,而在 HashSet 中只輸入一個值。
Java代碼:
private transient HashMap map;// Constructor - 1
// All the constructors are internally creating HashMap Object.
public HashSet()
{// Creating internally backing HashMap objectmap = new HashMap();
}// Constructor - 2
public HashSet(int initialCapacity)
{// Creating internally backing HashMap objectmap = new HashMap(initialCapacity);
}// Dummy value to associate with an Object in Map
private static final Object PRESENT = new Object();
而 HashSet 類的 add 方法的實現是這樣子的,很明顯可以看到是調用了 HashMap 里的 put() 方法。而里面的 present 則是常量,就是沒用的。
public boolean add(E e)
{ return map.put(e, PRESENT) == null;
}
三、HashSet 的使用
1、構造方法
HashSet 提供了五種方式的構造器,其中 4 種是 public 修飾的:
方法名 | 方法說明 | 方法名 | 方法說明 |
---|---|---|---|
public HashSet() | 無參構造方法,完成 map 的創建; | public HashSet(int initialCapacity) | 指定初始化大小 |
public HashSet(int initialCapacity, float loadFactor) | 指定初始化大小,和負載因子 | public HashSet(Collection) | 定集合轉化為 HashSet, 完成 map 的創建 |
HashSet(int initialCapacity, float loadFactor, boolean dummy) | 指定初始化大小和負載因子,dummy 無實際意義 |
2、常用方法
方法名 | 方法說明 | 方法名 | 方法說明 |
---|---|---|---|
boolean add(E e) | 添加一個元素,如果該元素已經存在,則返回true,如果不存在,則返回false | boolean remove(Object o) | 刪除指定的元素,刪除成功返回true |
Iterator<E> iterator() | 獲取hashSet的迭代器 | int size() | 獲得大小 |