package ecpay_practice2;
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
public class HashSetPractice2 {
public static void main(String[] args) {
// 版本二:正確的示範 (The Correct Version)
Set<CorrectUser> onlineUsers = new HashSet<>();
System.out.println("--- 開始新增使用者 ---");
CorrectUser alice1 = new CorrectUser("Alice");
CorrectUser alice2 = new CorrectUser("Alice"); // 內容相同的物件
CorrectUser bob = new CorrectUser("Bob");
onlineUsers.add(alice1);
onlineUsers.add(bob);
onlineUsers.add(alice2);
System.out.println(onlineUsers);
//結果分析:這次 Set 第二個 "Alice" 物件沒有被加進去。
}
}
//1. 定義 User 類別 (正確覆寫 equals 和 hashCode)
class CorrectUser {
private String username;
public CorrectUser(String username) {
super();
this.username = username;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
@Override
public String toString() {
return "CorrectUser{" + "Fusername='" + username + '\'' + '}';
}
// 2. 覆寫 equals 方法,父類別為Object
// 我們的邏輯:只要 username 相同,就認為是同一個 User
@Override
public boolean equals(Object obj) {
// 如果是同一個記憶體位址,肯定是同一個物件
if (this == obj)
return true;
// 如果傳入的物件是 null,或是不是同一個類別,肯定不相等
if (obj == null || getClass() != obj.getClass())
return false;
// 將物件轉型為 CorrectUser
CorrectUser that = (CorrectUser) obj;
// 使用 Objects.equals 來比較 username,這樣可以安全地處理 username 是 null 的情況
return Objects.equals(username, that.username);
}
// 3. 覆寫 hashCode 方法
// **重要規則**:如果 equals() 返回 true,那麼 hashCode() 必須返回相同的值。
// 所以我們也只基於 username 來產生 hash code。
@Override
public int hashCode() {
return Objects.hash(username);
}
}
一、Gotcha Version失效原因
二、總結