hashset 不重複主要add 方法實現,使用 add 方法找到是否存在元素,存在就不新增,不存在就新增。hashset 主要是基於hashmap 實現的,hashmap 的key就是 hashset 的元素,hashset 基於hash 函式實現元素不重複。
首先看 add 方法:
public boolean add(e e)
hashmap 的put 方法,map 的 put 方法呼叫 putval 方法。
public v put(k key, v value)
hash 方法就是計算hash值,和右移16位^做運算使得hash分布更均衡
static final int hash(object key)
看一下 putval 方法:
/**
* implements map.put and related methods.
** @param hash hash for key
* @param key the key
* @param value the value to put
* @param onlyifabsent if true, don't change existing value
* @param evict if false, the table is in creation mode.
* @return previous value, or null if none
*/final v putval(int hash, k key, v value, boolean onlyifabsent,
boolean evict)
if (e.hash == hash &&
((k = e.key) == key || (key != null && key.equals(k))))
break;
p = e;}}
v oldvalue = e.value;
if (!onlyifabsent || oldvalue == null)
e.value = value;
afternodeaccess(e);
return oldvalue;}}
++modcount;
if (++size > threshold)
resize();
afternodeinsertion(evict);
//不存在原來的 key,返回 null
return null;
}
註解上看 return 註解
return previous value, or null if none
返回以前的值,如果不存在就返回null。
通過原始碼分析:
判斷原來的值是否為null
hashset 主要是利用的 hash 演算法的唯一性,每個元素的hash值是唯一的。
這裡的 equles 在原始碼是直接呼叫 object 的 equles 方法,是比較記憶體位址。但是在實際呼叫時,都是使用 string,或者 integer 等封裝型別,這些型別會重寫 equles 方法。這是最開始有些不懂的地方。如果覺得文章對你有幫助的話,請點個推薦吧!
HashSet如何保證元素不重複 面試必問
目錄 hashset 實現了 set 介面,由雜湊表 實際是 hashmap 提供支援。hashset 不保證集合的迭代順序,但允許插入 null 值。也就是說 hashset 不能保證元素插入順序和迭代順序相同。hashset 具備去重的特性,也就是說它可以將集合中的重複元素自動過濾掉,保證儲存在...
Set集合是如何保證元素不重複
在使用集合的時候,會經常用到set集合,set集合的特點如下 1,元素無序 2,元素不可重複 那麼set集合底層是如何保證元素無序的呢?1,在往set集合中新增物件的時候,首先會通過該物件的hashcode方法計算該物件的hash值。2,將計算出來的hash值去hash表中查詢,如果hash表中不存...
hashSet保證不重複的原理
總的來說,在向hashset中add 元素時,判斷元素是否存在的依據,不僅僅是hash碼值就能夠確定的,同時還要結合equles方法。hashset 類中的add 方法 public boolean add e e put 方法 public v put k key,v value modcount...