Java小白踩坑錄 - 連 equal 和 hashcode 都處對象了

Java 的 equal 和 hashcode 是相親相愛的一對

請看一下這單身狗的待遇吧,男單身狗的待遇。

public class EqualTest {
	private String Odd, even;
	
	public EqualTest(String Odd, String even) {
		this.Odd = Odd;
		this.even = even;
	}
	
	public boolean equals(Object o) {
		if (!(o instanceof EqualTest))
			return false;
		EqualTest n = (EqualTest)o;
		return n.Odd.equals(Odd) && n.even.equals(even);
	}
	
	/*
	public int hashCode() {
		return 32 * Odd.hashCode() + even.hashCode();
		}
	*/	
    public static void main(String[] args) {
        Set<EqualTest> s = new HashSet<>();
		s.add(new EqualTest("sigle", "couple"));
		System.out.println(s.contains(new EqualTest("sigle", "couple")));
	}
}

// 輸出
false

女單身狗待遇:

public class EqualTest {
	private String Odd, even;
	
	public EqualTest(String Odd, String even) {
		this.Odd = Odd;
		this.even = even;
	}
	/*
	public boolean equals(Object o) {
	if (!(o instanceof EqualTest))
	return false;
	EqualTest n = (EqualTest)o;
	return n.Odd.equals(Odd) && n.even.equals(even);
	}
	*/
	
	public int hashCode() {
		return 32 * Odd.hashCode() + even.hashCode();
	}		
		
	public static void main(String[] args) {
		Set<EqualTest> s = new HashSet<>();
		s.add(new EqualTest("sigle", "couple"));
		System.out.println(s.contains(new EqualTest("sigle", "couple")));
	}
}

// 輸出
false

虐狗一對出現:

public class EqualTest {
    
	private String Odd, even;
	public EqualTest(String Odd, String even) {
		this.Odd = Odd;
		this.even = even;

}

public boolean equals(Object o) {

	if (!(o instanceof EqualTest))
		return false;

	EqualTest n = (EqualTest)o;
	return n.Odd.equals(Odd) && n.even.equals(even);

}

public int hashCode() {
	return 32 * Odd.hashCode() + even.hashCode();
}

public static void main(String[] args) {
    
	Set<EqualTest> s = new HashSet<>();
	s.add(new EqualTest("sigle", "couple"));
	System.out.println(s.contains(new EqualTest("sigle", "couple")));

}
}

// 輸出
true

追根究底

hashcod約定

When overriding equals() in a class, the hashCode() method should be overrided as well such that it maintains its contract with equals().

簡單說:hashCode 約定要求相等的對象要具有相同的散列碼。爲了遵守這項約定,無論何時,只要你覆寫了equals 方法,你就必須同時覆寫 hashCode 方法。

簡單來說如果兩個對象equals相等,則它們的hashcode必須相等,而hashcode相等,equals則不一定相等。原因在於,前面我們說過hashCode是儘量保證唯一,儘量平均分佈,但由於不可避免地會存在哈希值衝突的情況,此時兩個對象即便hashCode相等,equals也不一定相等,而equals相等hashCode必定相等是因爲,對象的內容相等而根據對象內容生成的hashCode當然也是相等的了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章