equals
public boolean equals()
官方API描述 :
equals 方法在非空對象引用上實作相等關系 Object 類的 equals
方法實作對象上差别可能性最大的相等關系;即,對于任何非空引用值 x 和 y,當且僅當 x 和 y 引用同一個對象時,此方法才傳回
true(x == y 具有值 true)。 實際中,根據對象 的特有内容來判斷對象是否相同,覆寫此方法
注意:當此方法被重寫時,通常有必要重寫 hashCode 方法,以維護 hashCode
方法的正常協定,該協定聲明相等對象必須具有相等的哈希碼。
Object的equals()方法比較的是位址,但是實際開發中一般根據對象 的特有内容來判斷對象是否相同,覆寫此方法。
hashCode
public int hashCode()
官方API描述 :
hashCode 的正常協定是:
在 Java 應用程式執行期間,在對同一對象多次調用 hashCode 方法時,必須一緻地傳回相同的整數,前提是将對象進行 equals
比較時所用的資訊沒有被修改。從某一應用程式的一次執行到同一應用程式的另一次執行,該整數無需保持一緻。 如果根據
equals(Object) 方法,兩個對象是相等的,那麼對這兩個對象中的每個對象調用 hashCode 方法都必須生成相同的整數結果。
如果根據 equals(java.lang.Object) 方法,兩個對象不相等,那麼對這兩個對象中的任一對象上調用 hashCode
方法不 要求一定生成不同的整數結果。但是,程式員應該意識到,為不相等的對象生成不同整數結果可以提高哈希表的性能。 實際上,由 Object
類定義的 hashCode 方法确實會針對不同的對象傳回不同的整數。(這一般是通過将該對象的内部位址轉換成一個整數來實作的,但是
JavaTM 程式設計語言不需要這種實作技巧。)
getClass
public final Class <?>
getClass()傳回此 Object 的運作時類。
官方API描述 :
傳回的 Class 對象是由所表示類的 static synchronized 方法鎖定的對象。
實際結果類型是 Class
<? extends |X|>
,其中 |X| 表示清除表達式中的靜态類型,該表達式調用 getClass。 例如,以下代碼片段中不需要強制轉換:
Number n = 0;
Class
c = n.getClass();
<? extends Number>
當我們在建立對象時,必須先有類.class檔案加載完成,然後通過.class檔案擷取到裡面的具體内容,包括屬性及行為,是以對于同一個類型的對象getClass()擷取的内容時相同的
toString
public String toString()傳回該對象的字元串表示。
官方API描述 :
通常,toString 方法會傳回一個“以文本方式表示”此對象的字元串。結果應是一個簡明但易于讀懂的資訊表達式。建議所有子類都重寫此方法。
Object 類的 toString 方法傳回一個字元串,該字元串由類名(對象是該類的一個執行個體)、at
标記符“@”和此對象哈希碼的無符号十六進制表示組成。換句話說,該方法傳回一個字元串,它的值等于:
getClass().getName() + ‘@’ + Integer.toHexString(hashCode())
實際中建議所有子類都覆寫這個方法來實作特有功能
代碼示範
class Demo
{
private int age;
Demo(){}
Demo(int age)
{
this.age = age;
}
//根據對象 的特有内容來判斷對象是否相同,覆寫此方法
public boolean equals(Object o)
{
if(o instanceof Demo)
return this.age == ((Demo)o).age;//這裡必須做類型轉換,否則Object對象不能通路子類特有内容
else
throw new ClassCastException("類型錯誤!");
}
//實際情況中若覆寫了equals方法,也要覆寫hashCode()方法,以保證相同對象産生相同哈希值
public int hashCode()
{
return age;//瞎寫的
}
}
class EqualDemo
{
public static void main(String[] args)
{
//equals測試
Demo d = new Demo();
Demo d1 = new Demo();
Demo d2 = d;
System.out.println(d.equals(d1));
System.out.println(d.equals(d2));
//hashCode測試
System.out.println(d.toString()+'\n'+d1.toString()+'\n'+d2.toString());
//列印對象哈希值
//[email protected]
//[email protected]
//[email protected]
System.out.println(d.hashCode());//哈希值的十進制705927765
//System.out.println(Integer.toHexString(d.hashCode()));//同樣是705927765
System.out.println("d哈希值 : "+d.hashCode()+"d2哈希值 : "+d2.hashCode());//d哈希值 : 10d2哈希值 : 10
//getClass()測試
Class c1 = d.getClass();
Class c2 = d1.getClass();
System.out.println(c1==c2);//true,因為c1,c2産生自同一個Class檔案
}
}