object类
equals方法
class Person{
public String number ;
public Person(String number) {
this.number = number;
}
@Override
public String toString() {
return "Person{" +
"number='" + number + '\'' +
'}';
}
}
public class L523 {
public static void main(String[] args) {
Person person1 = new Person("123");
Person person2 = new Person("123");
System.out.println(person1==person2);
System.out.println(person1.equals(person2));
}
}
这种情况下反而结果是false
因为equal的底层是
this表示谁调用的equals谁就是this obj接收equals括号内的参数,因此比较的还是两个地址,所以说会输出不相同的false。
所以说需要自己去重写一个equals方法,可以通过编译器来生成也可以直接手写。
public boolean equals(Object obj) {
Person tmp = (Person) obj;
return this.number.equals(tmp.number);
//使用两个字符之间的equals来判断内容是否相等,而不是地址。
}
现在就可以输出ture了。
改进一下重写代码:
public boolean equals(Object obj) {
//为空则返回false
if(obj == null){
return false;
}
//保存的同一个地址就返回ture
if(this == obj){
return true;
}
//如果obj不是person类返回false
if(!(obj instanceof Person)){
return false;
}
Person tmp = (Person) obj;
return this.number.equals(tmp.number);
}
hashcode方法
底层由c和c++代码组成,看不见具体内容。
public class L523 {
public static void main(String[] args) {
Person person1 = new Person("123");
Person person2 = new Person("123");
System.out.println(person1.hashCode());
System.out.println(person2.hashCode());
}
}
//hash这个方法本来是用来是这两个成员变量的值相同的,但是现在打印出来的值却不一样。
进行重写方法:
@Override
public int hashCode() {
return Objects.hash(number);
}
//重写hash方法,重写后打印出来是相同的位置。
我们也可以直接用编译器生成hashcode方法
public boolean equals(Object o) {
if (this == o) return true;
//如果两个地址相同就true
if (o == null || getClass() != o.getClass()) return false;
//类似于instanceof的判断方法
Person person = (Person) o;
return Objects.equals(number, person.number);
}
@Override
public int hashCode() {
return Objects.hash(number);
}