Java Set集合去重的原理及實(shí)現(xiàn)
在開(kāi)發(fā)中經(jīng)常使用到Set集合去重,那么去重的原理是怎樣實(shí)現(xiàn)的呢?在此文章記錄一下去重原理?。?!
下面是set集合類圖

下面我們來(lái)跟蹤一下執(zhí)行過(guò)程;
首先我們實(shí)例化一個(gè)Set對(duì)象;
Set<8大基本類型> set = new HashSet<8大基本類型>(); set.add(8大基本類型);
add操作會(huì)調(diào)用HashMap中的add方法;
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
HashMap中的add方法依賴了HashMap的put方法;
public V put(K key, V value) {
if (key == null)
return putForNullKey(value);
int hash = hash(key.hashCode());
int i = indexFor(hash, table.length);
for (Entry<K,V> e = table[i]; e != null; e = e.next) {//每添加一個(gè),則循環(huán)判斷是否與map中的元素相等
Object k;
// 先判斷hashcode是否一致,然后再判斷值是否相等
if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
V oldValue = e.value;
e.value = value;
e.recordAccess(this);
return oldValue;
}
}
modCount++;
addEntry(hash, key, value, i);
return null;
}
但是上述方法只對(duì)基本數(shù)據(jù)類型有效,下面是應(yīng)用到復(fù)雜對(duì)象的講解。
下面就是重寫(xiě)對(duì)象User的實(shí)現(xiàn),重寫(xiě)equals和hashCode方法;
測(cè)試類
public class User {
//id
protected Integer id;
//username
protected String username;
//構(gòu)造方法
public User(int id,String username){
this.id = id;
this.username = username;
}
/**
* 如果對(duì)象是USER,先比較hashcode,一致的場(chǎng)合在比價(jià)每個(gè)屬性的值
*/
@Override
public boolean equals(Object obj) {
if(obj == null)
return false;
if(this == obj)
return true;
if(obj instanceof User){
User user = (User) obj;
//if(user.id == this.id) return true; //只比較id
//比較id和username 一致時(shí)才返回true,之后再去比較hashCode
if(user.id == this.id && user.username.equals(this.username)){
return true;
}
}
return false;
}
/**
*
* 重寫(xiě)hashCode方法,返回的hashCode不一樣 才認(rèn)為是不一樣的對(duì)象;
*/
@Override
public int hashCode() {
//return id.hashCode(); 只比較id,id不一樣就添加進(jìn)集合;
return id.hashCode() * username.hashCode();
}
}
實(shí)現(xiàn)類
import java.util.HashSet;
import java.util.Set;
public class test {
public static void main(String[] args){
User user1 = new User(1,"xiaoqiang");
User user2 = new User(2,"xiaoqiang");
User user3 = new User(1,"xiaoqiang");
User user4 = new User(1,"xiaoqiang");
Set<User> set = new HashSet<User>();
set.add(user1);
set.add(user2);
set.add(user3);
set.add(user4);
for(User u : set){
System.out.println("id:" + u.id +" username:"+ u.username);
}
}
}
輸出結(jié)果
id:2 username:xiaoqiang
id:1 username:xiaoqiang
以上就是Java Set集合去重的原理及實(shí)現(xiàn)的詳細(xì)內(nèi)容,更多關(guān)于Java Set集合去重的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
SpringBoot實(shí)現(xiàn)License生成和校驗(yàn)的過(guò)程詳解
在我們向客戶銷售商業(yè)軟件的時(shí)候,常常需要對(duì)所發(fā)布的軟件實(shí)行一系列管控措施,諸如驗(yàn)證使用者身份、軟件是否到期,以及保存版權(quán)信息和開(kāi)發(fā)商詳情等,所以本文給大家介紹了SpringBoot實(shí)現(xiàn)License生成和校驗(yàn)的過(guò)程,需要的朋友可以參考下2024-09-09
MyBatis Plus整合Redis實(shí)現(xiàn)分布式二級(jí)緩存的問(wèn)題
Mybatis內(nèi)置的二級(jí)緩存在分布式環(huán)境下存在分布式問(wèn)題,無(wú)法使用,但是我們可以整合Redis來(lái)實(shí)現(xiàn)分布式的二級(jí)緩存,這篇文章給大家介紹MyBatis Plus整合Redis實(shí)現(xiàn)分布式二級(jí)緩存,感興趣的朋友跟隨小編一起看看吧2023-11-11
springboot?web項(xiàng)目中?Set-Cookie?失敗原因及解決辦法
這篇文章主要介紹了springboot?web項(xiàng)目中?Set-Cookie?失敗原因及解決辦法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-10-10
詳解SpringBoot配置文件啟動(dòng)時(shí)動(dòng)態(tài)配置參數(shù)方法
這篇文章主要介紹了詳解SpringBoot配置文件啟動(dòng)時(shí)動(dòng)態(tài)配置參數(shù)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
springBoot詳細(xì)講解使用mybaties案例
MyBatis本是apache的一個(gè)開(kāi)源項(xiàng)目iBatis,2010年這個(gè)項(xiàng)目由apache software foundation遷移到了google code,并且改名為MyBatis。2013年11月遷移到Github。iBATIS一詞來(lái)源于“internet”和“abatis”的組合,是一個(gè)基于Java的持久層框架2022-05-05
解決Hibernate4執(zhí)行save()或update()無(wú)效問(wèn)題的方法
這篇文章主要為大家詳細(xì)介紹了解決Hibernate4執(zhí)行save()或update()無(wú)效問(wèn)題的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-06-06
Java利用策略模式優(yōu)化過(guò)多if else代碼
這篇文章主要介紹了Java利用策略模式優(yōu)化過(guò)多if else代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09

