对于HashSet的去重原理
1、先调用被添加元素的 hashCode(),和 HashSet 中已有元素的 hashCode 比较是否相同
2、如果不相同,直接存储该元素
3、如果相同,再调用 equals 方法比较元素是否相同
4、如果不相同,直接存储该元素(equals返回false)
5、如果相同(equals返回true),认为是同一元素,不存储
现在看下面的例子,目的是去重同名的元素
package chapter9;
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
public class NativeMethodTest {
public static void main(String [] args){
Set<User_1> userSet = new HashSet<>();
userSet.add(new User_1("jack",22));
userSet.add(new User_1("tom",12));
userSet.add(new User_1("tony",22));
userSet.add(new User_1("tom",122));
System.out.println(userSet);
// for(User_1 user1 : userSet){
// System.out.println(user1);
// }
}
}
class User_1{
private int age;
private String name;
public User_1(String name, int age){
this.name = name;
this.age = age;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;//地址是否相同
if (o == null || getClass() != o.getClass()) return false;
User_1 user = (User_1) o;
return Objects.equals(name, user.name)||age == user.age ;
}
@Override
public int hashCode() {
return Objects.hash(name);
}
//
// @Override
// public int hashCode() {
// return Objects.hash(age,name);
// }
//判断地址是否一样
//非空判断和class类型判断
//强转
//对象里面的字段一一匹配
// @Override
// public boolean equals(Object obj) {
//
// if(this == obj) return true;
//
// if(obj == null || getClass() != obj.getClass()) return false;
//
// User_1 user = (User_1) obj;
//
// return age == user.age && name.equals(user.name);
// }
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User_1{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
}
如果我们想去除的是所有属性都一样的元素(即不只有name这一个属性一样的元素),那么我们需要对hashCode和equals进行一些修改,修改如下,也就是将equals中 || 改为&&,将hashCode改为Objects.hash(age,name)
@Override
public boolean equals(Object o) {
if (this == o) return true;//地址是否相同
if (o == null || getClass() != o.getClass()) return false;
User_1 user = (User_1) o;
return Objects.equals(name, user.name)&&age == user.age ;
}
@Override
public int hashCode() {
return Objects.hash(age,name);
}