類的方法前加final關鍵字,說明該方法不能被該類的子類重寫。ide
若是類具備本身特有的「邏輯相等」概念(不一樣於對象等同的概念),並且超類尚未覆蓋equals以實現指望的行爲,這時候咱們就須要覆蓋equals方法。this
equals方法實現了等價關係:自反性,對稱性,傳遞性,一致性,非空性(x.equals(null)返回爲false)spa
class Student{ private String name; private int age; private double height; @Override public boolean equals(Object obj) { //使用==操做符檢查「參數是否爲這個對象的引用」 if(this==obj) return true; //使用instanceof操做符檢查「參數是否爲正確的類型」 if(!(obj instanceof Student)) return false; //把參數轉換成正確的類型。 Student student=(Student) obj; //對於該類中的每一個「關鍵」閾,檢查參數中的閾是否與該對象中對應的閾相匹配。 return this.name==student.name && this.age==student.age && this.height==student.height; } }
一、編寫完成equals方法以後,應該問本身三個問題:它是否對稱的、傳遞的、一致的。code
二、不要將equals聲明中的Object對象替換爲其餘的類型對象
public boolean equals(Student obj)
這樣至關於重載了equals方法,而非是覆蓋。blog
HashCode有一條約定以下:遞歸
若是兩個對象根據equals(Object)方法比較是相等,那麼調用這兩個對象中任意一個對象的hashCode方法都必須產生一樣的整數結果。string
下面給出一種簡單的解決辦法:hash
private boolean flag=true; int boolTemp=flag?0:1;
private double height; long heightBits=Double.doubleToLongBits(height); int heightTemp=(int)(heightBits ^ (heightBits >>> 32));
private String name; int stringTemp=this.name.hashCode();
完整的Student類:it
class Student{ private String name; private int age; private double height; @Override public boolean equals(Object obj) { //使用==操做符檢查「參數是否爲這個對象的引用」 if(this==obj) return true; //使用instanceof操做符檢查「參數是否爲正確的類型」 if(!(obj instanceof Student)) return false; //把參數轉換成正確的類型。 Student student=(Student) obj; //對於該類中的每一個「關鍵」閾,檢查參數中的閾是否與該對象中對應的閾相匹配。 return this.name==student.name && this.age==student.age && this.height==student.height; } @Override public int hashCode() { //初始化 int result=17; //String類型 result=this.name.hashCode()+result; //int類型 result=this.age+result; //double類型 long heightBits=Double.doubleToLongBits(height); int heightTemp=(int)(heightBits ^ (heightBits >>> 32)); result=heightTemp+result; //返回 return result; } }