HashSet保證元素唯一性

2021-09-11 19:05:53 字數 1958 閱讀 8801

set儲存的資料是唯一性的,是通過儲存的物件的兩個方法進行唯一性判斷的hashcode( )和equals(),在呼叫集合的add(e e)方法時,會進行判斷,通過e.hashcode( )獲取要新增物件的hash值,和集合裡面的物件進行判斷,如果hash值不一樣,則會儲存。如果一樣,則會呼叫equals()方法,和集合中hash值一樣的物件進行判斷,如果有乙個equals返回true,則判定一樣,直到所有大的hash值一樣的資料,通過equals方法都為false,才會儲存。(set的儲存結構是hash表,hash值一樣的時候,往儲存(類似資料結構中,解決hash衝突的第二種方式))。

建立乙個hashset集合物件,往裡面儲存user物件,分析執行步驟。

set呼叫add(e)方法,

獲取通過e.hashcode()獲取物件的hash值。

將判斷集合中,是否存在相同的hash值,沒有則儲存

集合中存在相同的hash值物件,則取出這些hash值和e的相同的物件

遍歷這些相同hash值相同的物件,通過呼叫e.equals()判斷是否一樣,不一樣,則儲存。

案例分析

建立user物件,重寫equas(user u),和hashcode(),這裡hashcode返回資料是一樣的,讓儲存的時候都進行判斷。

package day14_list.setdemo;

public

class

user

public string getname()

public

void

setname

(string name)

@override

/** * 重寫equal方法,讓hash值一樣是,唯一性判斷,按自己

* 需求來,如果不更改,則是按照物件位址值進行判斷。

*/public

boolean

equals

(object obj)

@override

/** * 重寫hashcode(),讓返回值一樣,方便進行測試,這樣每加入乙個元素

* hash值是一樣的,則會進行equals判斷。

*/public

inthashcode()

}

set呼叫add方法,進行儲存

package day14_list.setdemo;

/** *

* 類名:set的判斷元素重複是根據hash值,要判斷,需要自定義

* 生成的hash值

* * hashset 保證元素物件的唯一性:

* 1-通過複寫hashset方法,改變要儲存物件的hashcode值,

* 先判斷hash值是否一樣

* 2-hash值一樣時,通過equal方法判斷;

* * @author mahao

* @date 2023年6月25日

* description:

*/public

class

setdemo

}}

將判斷集合中,是否存在相同的hash值,沒有則儲存(jdk中原始碼)

集合中存在相同的hash值物件,則取出這些hash值和e的相同的物件

6. 上圖中可以看到是通過e.equals(k),進行資料比較。

執行結果為

HashSet保證元素唯一性原理

使用set集合都是需要去掉重複元素來保證元素的唯一性 如果在儲存的時候逐個equals 比較,效率較低,雜湊演算法提高了去重複的效率,降低了使用equals 方法的次數 當hashset呼叫add 方法儲存物件的時候,先呼叫物件的hashcode 方法得到乙個雜湊值,然後在集合中查詢是否有雜湊值相同...

HashSet如何保證元素的唯一性

底層資料結構是雜湊表 元素是鍊錶的陣列 也就是說,保證元素的唯一性的第一層保證就是元素的hashcode。下面我們從原始碼的角度來分析 當我們向hashset中插入乙個元素的時候,發生了什麼。public hashset 這裡hashset的構造函式呼叫了hashmap,public class h...

HashSet集合是如何保證元素的唯一性的?

hashset 集合的特點是元素無序和不重複 首先,hashset 的底層資料結構是雜湊表。雜湊表就是儲存一系列雜湊值的表,而雜湊值是由物件的 hashcode 方法生成的。確保元素唯一性的兩個方法,hashcode 和equals 方法。當呼叫 add 方法向集合中存入物件的時候,先比較此物件與原...