equals()方法
对于基本数据类型,如int、double、boolean等,“==”比较的是值本身是否相等;对于非基本数据类型,比如说一个类的对象,“==”比较的却是变量存储的地址,而不是值本身(引用等价性)。String str1 = new String("hello");
String str2 = str1;
System.out.println(str1 == str2); //true
String str1 = new String("hello");
String str2 = new String("hello");
System.out.println(str1 == str2); //false
即使内容相同,但是由于存储地址不同,故“==”结果为false。为了解决上面的问题,我们可以用equals()方法来比较两个值是否相等。
首先先来看一下Java中的Object.equals()方法
public boolean equals(Object object){
return(this == obj);
}
我们现在调用String类中的equals()方法
String str1 = new String("hello");
String str2 = new String("hello");
System.out.println(str1.equals(str2)); //true
所以比较类对象是否相等时,我们不能简单的使用“==”,而是要调用该类的equals()方法。对于自己写的一个类,我们需要重写equals()方法,否则会去调用Object类的equals()方法。
@Override public boolean equals(Object that)
这里给出一个重写equals()的方法,为了构造自己逻辑相等这一概念。
Class Person {
private final String Name;
Private final int age;
public Person(String Name, int age) {
this.Name = Name;
this.age = age;
}
public String getName() {
return Name;
}
public int getage() {
return age;
}
}
1. 检测this与that是否引用同一个对象:
if(this == that) {
return true;
}
2. 检测that是否为null,如果为null,返回flase:
if(that == null) {
return false;
}
3. 判断this与that是否为同一类对象,如果是的话,将that转换成相应的对象类型,就可以进行比较了:
if(that instanceof Person) {
Person other = (Person)(That);
return this.getName().equals(other.getName()) && this.getAge() == other.getAge();
}
比较时也要注意,对于基本数据类型,用“==”比较即可,但是对于对象数据类型,需要用equals()方法。
如果重写equals()方法的话,必须重写hashCode()方法,以便用户可以将对象插入到散列表中。hashCode()方法
在重写hashCode前,可以自行看一下JDK中String类的hashCode()方法如何实现的,采用了31作为乘子,由于31为一个不大不小的质数,并且 31 * i = ( i<<5 ) - i 。除了31外,17、37、41、43也可以,还是看上面那个例子。
@Override public int hashCode() {
int result = 17;
result = 31 * result + Name.hashCode();
result = 31 * result + age;
return result;
}
为什么要写hashCode()呢,简单的说就是为了保证同一个对象,保证在equals()为真的时候hashCode一定相同,如果仅重写equals(),就有可能出现两个不同的对象满足equals()。在重写equals()和hashCode()方法时,要注意它们两个要保持一致,比如说,equals()中比较的时Name和age,所以hashCode()中也需要必须只用到Name和age。
在自己定义的类数据类型中,一定要重写equals()和hashCode()方法。
其实。IDE可以生成equals()和hashCode()。