對於正常的值來說==和equals區別不大,主要是針對數值來進行判斷;
主講hashcode和equals方法與==和equals的關係
下面來介紹類
1、不重寫hashcode方法和equals方法
Student.java
public class Student {
private String name;
private int age;
public Student(String name,int age){
this.name=name;
this.age=age;
}
}
TestHashCode.java
public class TestHashCode {
public static void main(String[] args){
Student s1= new Student("aa", 17);
Student s2= new Student("aa", 17);
System.out.println(s1.hashCode());
System.out.println(s2.hashCode());
System.out.println(s1==s2);
System.out.println(s1.equals(s2));
}
}
這樣出現的結果是:false,true;理由==比較s1和s2的內存地址,而equals比較的是其真實的值;
2、重寫hashcode方法和equals方法
Student.java
public class Student {
private String name;
private int age;
public Student(String name,int age){
this.name=name;
this.age=age;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Student other = (Student) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
}
TestHashCode.java
public class TestHashCode {
public static void main(String[] args){
Student s1= new Student("aa", 17);
Student s2= new Student("aa", 17);
System.out.println(s1.hashCode());
System.out.println(s2.hashCode());
System.out.println(s1==s2);
System.out.println(s1.equals(s2));
}
}
結果:false,true;原因是重寫了equals方法以後,對於對象student equals裏面的方法來說計算出來的值是true,被認爲是同一個對象,所以是true。對於==爲false,暫時不明,有待研究源碼,也請高手解釋下。
3、重寫hashcode方法,不重寫equals
這裏就不貼出代碼,結果均爲false,false;
4、重寫equals方法,不重寫hashcode方法
結果爲false,true;
結論:
從上述的結果可以得出部分靠譜結論,在不重寫equals方法時,新new出來的student對象分配不同的內存,使用不同地址,無論是equals還是==均是false;
而在重寫equals方法以後,當對象滿足相同的條件是就會被認爲是同一個對象,即用equals方法所得爲true.