import java.util.HashMap;
import java.util.Map;
public class has {
}
class Test {
public static void main(String[] args) {
Person person1 = new Person("TUCJVXCB");
Person person2 = new Person("TUCJVXCB");
Map<Person, Integer> hashMap = new HashMap<>();
hashMap.put(person1, 1);
System.out.println(person1.equals(person2));
System.out.println(hashMap.containsKey(person2));//map.containsKey(); //获取map指定的键名 判断是否包含指定的键名
}
static class Person {
private String name;
public Person(String name) {
this.name = name;
}
@Override
public boolean equals(Object obj) //Object obj 表示obj是Object类型的变量。
//Object是这些类的原始祖先。String类什么的包括你自己定义的类,都可以归到它的名下。(int 不是类,是基本数据类型)
//好处是,这样可以适应更广泛的传参类型而不必每个类的参数类型都去专门定义一个功能类似的方法,当一个方法为
//fun(Object a){}的时候
//你用String做a也可以,用YourClass自定义的类做a等都可以
//而你如果只是
//fun(String a){ }的话,就只能用String来做参数a。当你需要其他参数的fun的时候,你还得再新写一个fun(OtherClass a){}
{
if (obj instanceof Person)//
//instanceof用来判断一个对象是不是一个类的实例,
//也可以看它是不是数组(不过不经常用)。Person person=(Person)obj,
// 是将obj转换成Person的实例。如果Person继承了Object,运行的时候不会有什么异常,
// 但如果Object继承了Person的话,运行的时候会抛出异常。
// 这句话用于判断Person是否被obj包含,
//如果不属于的话后面的 Person p = (Person)obj;就无法执行了。
{
Person person = (Person) obj;
return name.equals(person.name);
}
return false;
}
@Override
public int hashCode() {
return name.hashCode();
}
//equals(Object)方法比较是相等的,那么调用这两个对象中的hashCode方法都必须产生同样的整数结果
// 如果一个类重写了equals方法但是没有重写hashCode方法,那么该类无法结合所有基于散列的集合(HashMap,HashSet)一起正常运作。
//相等的对象必须拥有相等的hash code
}
}