==與equals解疑

      對於正常的值來說==和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.


發佈了45 篇原創文章 · 獲贊 122 · 訪問量 16萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章