hashSet 防重复 之改写

本文介绍了一个使用 Java HashSet 实现的简单用户注册系统。通过覆盖 hashCode 和 equals 方法确保用户名密码组合的唯一性,避免重复注册。文章展示了如何利用 Scanner 类获取用户输入,并实时反馈注册结果。
package com.conpany.hashset;


import java.util.HashSet;
import java.util.Scanner;


//需求: 以hashset 保存用户名密码 同用户名和密码无法注册
class User{
String name;
String password;

public User(String name,String password) {
super();
this.name=name;
this.password=password;

}
@Override
public String toString() {
return "{用户名"+this.name+"密码"+this.password+"}";
}

@Override
public int hashCode() {//改写
//难点把字符串 转化为int 
return name.hashCode()+password.hashCode();
}
@Override
public boolean equals(Object obj) {//改写
User user =(User)obj;
return this.name.equals(user.name)&&this.password.equals(user.password);
}
}
public class Demo2 {
public static void main(String[] args) {
Scanner scan=new Scanner(System.in);
HashSet set=new HashSet();
while(true){
System.out.println("请输入用户名" );
String username=scan.next();
System.out.println("请输入密码");
String password=scan.next();
if(set.add(new User(username,password))){
System.out.println("注册成功"+set);
}else{
System.out.println("注册失败");
}
;
}

}


}
### HashSet 出现重复数据的原因 当 `HashSet` 底层使用的 `equals` 和 `hashCode` 方法未被正确重写时,可能导致 `HashSet` 判断元素相等性的逻辑失效,进而允许添加相同的元素[^1]。具体来说: - 如果两个对象的 `hashCode()` 返回不同的整数,则这两个对象一定不相等。 - 如果两个对象的 `hashCode()` 返回相同的整数,还需要进一步调用 `equals(Object)` 来确认它们是否真正相等。 因此,如果类没有适当地覆盖 `equals()` 或者 `hashCode()` 方法,即使两个对象实际表示同一事物,也可能被认为是不同的实例而被加入到同一个 `HashSet` 中。 ### 解决方案 为了止这种情况发生,应当确保自定义类正确实现了 `equals()` 和 `hashCode()` 方法。以下是实现这两者的建议原则: #### 正确实现 equals() 方法 应遵循以下规则来实现 `equals()` 方法: - 自反性:对于任何非空引用值 x, `x.equals(x)` 都应该返回 true; - 对称性:对于任意非空引用值 x 和 y, 当且仅当 `y.equals(x)` 也为真时,`x.equals(y)` 才能为真; - 传递性:对于任意非空引用值 x、y 和 z, 如果 `x.equals(y)` 返回 true 并且 `y.equals(z)` 返回 true,则 `x.equals(z)` 也应该返回 true; - 一致性:多次调用 `x.equals(y)` 总是返回同样的布尔值,前提是没有任何信息用于比较操作发生了变化; ```java @Override public boolean equals(Object o) { if (this == o) return true; if (!(o instanceof YourClass)) return false; YourClass that = (YourClass) o; // Compare relevant fields here... } ``` #### 实现 hashCode() 方法 同样重要的是要保证只要两个对象通过 `equals()` 认定为相等,那么它们就必须具有相同的 `hashCode()` 结果。这通常意味着所有参与 `equals()` 比较的对象属性都应该参与到计算 `hashCode()` 的过程中。 ```java @Override public int hashCode() { int result = fieldA.hashCode(); result = 31 * result + fieldB.hashCode(); ... return result; } ``` ### 相关问题
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值