Java判断对象是否相等
1.类的创建
要判断两个对象是否相等,我们首先得创建相应得类并由此类创建两个对象;此处我们定义一个Monkey类,该类
包含两个属性:name 和 age;同时我们为类中得实例变量添加了构造器、getter和setter方法。
class Monkey{
private String name;
private int age;
public Monkey(String name, int age){
this.setName(name);
this.setAge(age);
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
Java中如何判断两个对象是否相等
Java通过hashCode()和equals的结果共同决定两个对象是否相等
hashCode()
hashCode() 的作用是获取哈希码,也称为散列码;它实际上是返回一个int整数。
这个哈希码的作用是确定该对象在哈希表中的索引位置。hashCode() 定义在JDK
的Object.java中,这就意味着Java中的任何类都包含有hashCode() 函数。
equals()
equals它的作用也是判断两个对象是否相等,如果对象重写了equals()方法,
比较两个对象的内容是否相等;如果没有重写,比较两个对象的地址是否相同,
价于“==”。同样的,equals()定义在JDK的Object.java中,这就意味着Java
中的任何类都包含有equals()函数。
注意:通常我们可以通过重写hashCode()和equals()来自定义两个对象相等的标准,且若重写,
必须同时对两个方法进行重写。
重写hashCode()和equals()
我们只需再上面定义的Monkey类中重写这两个方法即可;equals方法直接返回true,也就是说对
这个类产生的任意两个对象进行比较都会返回ture;hashCode()方法返回一个固定的值,这里取4。
class Monkey{
...
public boolean equals(Object obj) {
return true;
}
public int hashCode() {
return 4;
}
...
}
写测试类
下面我们创建一个HashCodeAndEqualsTest测试类进行测试。
public class HashCodeAndEqualsTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
Monkey monkey1 = new Monkey("wu kong", 10);
Monkey monkey2 = monkey1;
Monkey monkey3 = new Monkey("liu er", 5);
System.out.println("monkey1's name:" + monkey1.getName() + ",age:" + monkey1.getAge());
System.out.println("monkey2's name:" + monkey2.getName() + ",age:" + monkey2.getAge());
System.out.println("monkey3's name:" + monkey3.getName() + ",age:" + monkey3.getAge());
System.out.println("monkey1's hash code:" + monkey1.hashCode());
System.out.println("monkey2's hash code:" + monkey2.hashCode());
System.out.println("monkey3's hash code:" + monkey3.hashCode());
System.out.println("Is monkey1 equal to monkey2:" + monkey1.equals(monkey2));
System.out.println("Is monkey1 equal to monkey3:" + monkey1.equals(monkey3));
}
}
1.没有重写方法的程序执行结果
monkey1's name:wu kong,age:10
monkey2's name:wu kong,age:10
monkey3's name:liu er,age:5
monkey1's hash code:366712642
monkey2's hash code:366712642
monkey3's hash code:1829164700
Is monkey1 equal to monkey2:true
Is monkey1 equal to monkey3:false
monkey1和monkey2指向堆上的同一个对象,故monkey1.equals(monkey2)的结果为true,monkey1和
monkey3指向堆上两个不同的对象,故equals()方法返回false。
2.重写后的程序执行结果
monkey1's name:wu kong,age:10
monkey2's name:wu kong,age:10
monkey3's name:liu er,age:5
monkey1's hash code:4
monkey2's hash code:4
monkey3's hash code:4
Is monkey1 equal to monkey2:true
Is monkey1 equal to monkey3:true
由于我们对equals和hashCode方法进行了重写,重新确定了对象相等的标准,故monkey1和monkey3为
“同一对象”。
3.只重写equals方法时,程序的执行结果
monkey1's name:wu kong,age:10
monkey2's name:wu kong,age:10
monkey3's name:liu er,age:5
monkey1's hash code:366712642
monkey2's hash code:366712642
monkey3's hash code:1829164700
Is monkey1 equal to monkey2:true
Is monkey1 equal to monkey3:true
重写了equals方法后,monkey1和monkey3两个对象被认为指向同一实例,但他们的hash code不同
4.只重写hashCode方法时,程序的执行结果
monkey1's name:wu kong,age:10
monkey2's name:wu kong,age:10
monkey3's name:liu er,age:5
monkey1's hash code:4
monkey2's hash code:4
monkey3's hash code:4
Is monkey1 equal to monkey2:true
Is monkey1 equal to monkey3:false
虽然monkey1、monkey2的hash code相同,但equals方法返回false。