Java Set集合去重的原理及實(shí)現(xiàn)
在開(kāi)發(fā)中經(jīng)常使用到Set集合去重,那么去重的原理是怎樣實(shí)現(xiàn)的呢?在此文章記錄一下去重原理?。?!
下面是set集合類(lèi)圖
下面我們來(lái)跟蹤一下執(zhí)行過(guò)程;
首先我們實(shí)例化一個(gè)Set對(duì)象;
Set<8大基本類(lèi)型> set = new HashSet<8大基本類(lèi)型>(); set.add(8大基本類(lèi)型);
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ù)類(lèi)型有效,下面是應(yīng)用到復(fù)雜對(duì)象的講解。
下面就是重寫(xiě)對(duì)象User的實(shí)現(xiàn),重寫(xiě)equals和hashCode方法;
測(cè)試類(lèi)
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)類(lèi)
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ò)程詳解
在我們向客戶銷(xiāo)售商業(yè)軟件的時(shí)候,常常需要對(duì)所發(fā)布的軟件實(shí)行一系列管控措施,諸如驗(yàn)證使用者身份、軟件是否到期,以及保存版權(quán)信息和開(kāi)發(fā)商詳情等,所以本文給大家介紹了SpringBoot實(shí)現(xiàn)License生成和校驗(yàn)的過(guò)程,需要的朋友可以參考下2024-09-09MyBatis 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-11springboot?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-11springBoot詳細(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-06Java利用策略模式優(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