細說Java-hashCode、equals、==區別

1.what?

“==”、”equals()”、”hashCode()”這三個在Java編程找那個是不同而又有密切聯繫的概念。

  • “==”是操作符
  • “equals”是方法
  • hashCode()”是方法

2.How?

2.1 "=="用法


如果==的兩邊都是基本類型變量、包裝類對象所組成的表達式,==用於比較兩邊的表達式的值是否相等——只要兩邊的表達式的值相等,即使數據類不同,該運算符也會返回true。例如'a' == 97.0,將會返回 true。


<code>    @Test
public void t3()
{
boolean b = 'a' == 97.0;
System.out.println(b);
// b = true
}/<code>


如果==的兩邊是引用類型的變量,==用於判斷這兩個引用類型的變量是否引用同一塊內存,只有當它們引用同一塊內存時,==才會返回 true。


<code>    @Test
public void t4()
{
Person p1 = new Person("1");
Person p2 = new Person("1");
Person p3 = p1;

System.out.println(p1==p2);//false
System.out.println(p1==p3);//true
}/<code>


2.2 equals()用法

equals()則是 java.lang.Object 類的一個方法,因此任何 Java 對象都可調用該方法與其他對象進行比較。java.lang.Object 類的 equals 方法的實現代碼如下:


<code>  public boolean equals(Object obj) {
return (this == obj);
}/<code>

從上面代碼可以看出,如果一個類沒有重寫 java.lang.Object 的 equals()方法時,此時 equals()方法的比較結果與==的比較結果是相同的

但 Java 允許任何類重寫 equals()方法,重寫該方法就是讓程序員來自己決定兩個對象相等的標準

如:


<code>    // Person類 重寫equals方法,認為ID相同則是相同的對象
@Override
public boolean equals(Object obj)
{
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Person other = (Person) obj;
if (username == null) {
if (other.username != null)
return false;
}
return StringUtils.equalsIgnoreCase(this.getUserid(),other.userid);
}

//測試用例
@Test
public void t4()
{
Person p1 = new Person("1","張三");
Person p2 = new Person("1","李四");

boolean b = p1.equals(p2);// b=true
System.out.println(b);
}
/<code>

上面重寫 equals()方法用於判斷兩個 Person 對象是否“相等”,程序只要兩個 Person 對象的 name相等,程序就可以把這兩個 Person 對象當成相等(此處一般都根據業務決定)


總結起來就是一句話:開發者重寫 equals()方法就可以根據業務要求來決定兩個對象是 否“相等”


2.3 hashCode()用法

hashCode()方法也是來自 java.lang.Object 類的native方法,用戶生成 Java 對象hashCode值。


3. equals()和hashCode()的不同作用


hashCode()方法與 equals()方法相似,都是來自 java.lang.Object 類的方法,都允許用戶定義的子類重寫這兩個方法。


一般來說,equals()這個方法是給用戶調用的,如果你想根據自己的業務規則來判斷兩個對象是否相等,你可以重寫 equals()方法。簡單來講,equals 方法主要是用來判斷從表面上看或者從內容上看,兩個對象是不是相等

而 hashCode()方法通常是給其他類來調用的,比如當我們要把兩個對象放入 HashSet 時, 由於 HashSet 要求兩個對象不能相等,而 HashSet 判斷兩個對象是否相等的標準是通過equals()比較返回 false、或兩個對象的 hashCode()方法返回值不相等——只要滿足任意一個 條件都可會認為兩個對象不相等


從這個角度來看,我們可以把 hashCode()方法的返回值當成這個對象的“標識符”,如果兩個對象的 hashCode()相等,即可認為這兩個對象是相等的。因此當我們重寫一個類的 equals()方法時,也應該重寫它的 hashCode()方法,而且這兩個方法判斷兩個對象相等的標 準也應該是一樣的


比如兩個對象值相同(x.equals(y) == true),但卻可以有不同的 hashCode,因為 equals()方法可以由開發者重寫,hashCode()方法也可以由開發者來重寫,因此它們是否相等並沒有必然的關係


分享到:


相關文章: