HashSet 如何保證元素不重複 hash碼

2022-09-09 19:24:20 字數 1731 閱讀 5849

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...