【java】==操作符與equals的區別

==

如果比較的是基本數據類型,則直接比較其存儲的 “值”是否相等;

如果比較的是引用類型的變量,則比較的是所指向的對象的地址

equals

如果沒對equals方法進行重寫,則比較的是引用類型的變量所指向的對象的地址,這個和==號比較對象或者引用類型是一樣的效果

例如String、Date等類對equals方法進行了重寫,比較的是所指向的對象的內容。

重寫equals需要重寫hashcode 

 那爲什麼非得重寫hashcode呢?因爲對象的比較有硬性規定:

  1. 應用執行期間,同一個對象內容不發生改變,經過多次調用,hashCode方法都必須始終返回同一個值。如果把對象重新copy到另外一個應用程序裏,hashcode可以和上一個的不一樣。
  2. 如果兩個對象根據equals(Object)方法比較是相等的,那麼所產生的的hashcode必須一樣。
  3. 如果兩個對象根據equals(Object)方法比較是不相等的,那麼產生的hashcode可能一樣,也可能不一樣。
Integer t1 = new Integer(1);
Integer t2 = new Integer(1);
		
Set<Integer> set = new HashSet<Integer>();
set.add(t1);
set.add(t2);
		
// 可以發現size=1,如果不等size=2
System.out.println(set.size());

 我們用hashset來驗證,hashset是去重的。放t2的時候取hashcode值,然後會定位到student所在的桶,然後再比較內容,發現內容也一樣,於是t2會替換t1。

 

注意:

  •  浮點數間的等值判斷。是基本數據類型不能用==來比較,是包裝數據類型不能用equals 來判斷。

          說明:浮點數採用“尾數+階碼”的編碼方式,類似於科學計數法的“有效數字+指數”的表示方式。二進 制無法精確表示大部分的十進制小數

(1) 指定一個誤差範圍,兩個浮點數的差值在此範圍之內,則認爲是相等的。 
float a = 1.0f - 0.9f; 
float b = 0.9f - 0.8f; 
float diff = 1e-6f; 
 
if (Math.abs(a - b) < diff) {     
System.out.println("true"); 
} 


(2) 使用BigDecimal 來定義值,再進行浮點數的運算操作。 
BigDecimal a = new BigDecimal("1.0"); 
BigDecimal b = new BigDecimal("0.9"); 
BigDecimal c = new BigDecimal("0.8"); 
 
BigDecimal x = a.subtract(b); BigDecimal y = b.subtract(c); 
 
if (x.equals(y)) {     System.out.println("true"); } 
 

 

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