package unit5;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;
public class Java44 {
public static void main(String[] args) {
// HashSet不重复
// 注意:只对java类有效
// 原理:hashCode()、equals()
// 先计算对象的hashCode进行比较、如果没有相符的hashcode会假设没有重复出现、
// 如果发现有相同的hashCode会调用equlas方法检查是否相等、如果相等则不添加
// 解释:自定义一个类想使用hashset去重、必须重写hashcode、equals。
// HashSet的底层实现:HashSet是通过HashMap实现的!!
// 创建HashSet对象的时候、底层实际上是创建了一个HashMap集合
// ???????????public HashSet() {
// ???????????map = new HashMap<>();
// ???????????}
// HashSet添加对象的时候、底层实际上是作为key添加到HashMap中
// ???????public boolean add(E e) {
// ???????????return map.put(e, PRESENT)==null;
// ???????}
// 需求:如果名字和年龄都相同只添加一个。
Set<Person> set = new HashSet<Person>();
System.out.println(set.add(new Person("张三", 30)));
System.out.println(set.add(new Person("张三", 30)));
System.out.println(set.add(new Person("张三", 50)));
set.forEach(System.out::println);
}
}
class Person {
String name;
int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// 第一步:重写hashcode、返回相同的值
@Override
public int hashCode() {
return 100;
}
// 第二步:重写equals、定义相等的规则
@Override
public boolean equals(Object obj) {
Person person = (Person)obj;
return this.name.equals(person.name) && this.age==person.age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}