隨筆⑦ Java中的比較 ==,equals以及精度對比較的影響
Java中的比較 ==,equals
① 對於==,如果是作用於基本數據類型的變量,則直接比較其存儲的"值"是否相等;如果是作用於引用類型的變量,則比較的是所指向的對象的地址。
② 對於equals方法,註意:equals方法不能作用於基本數據類型的變量;
如果沒有對equals方法進行重寫,則比較的是引用類型變量所指向的對象的地址;諸如String,Date等類對equals方法進行了重寫的話,比較的是所指向的對象的內容。
③ Float類型值的比較:
一般情況下,浮點數是不直接進行判等比較的,因為浮點數存在精度問題。要比較兩個浮點數,一般的比較方法是設定一個精度,當二者的差小於某個精度時,認為二者相等
1 if (Math.abs(s - t) < 0.001) { 2 System.out.println("equal"); 3 }else { 4 System.out.println("not equal"); 5 }
④ Float類和Double類都重寫了對應的equals方法,在比較之前都會判斷是否同屬於Float對象或Double對象,如果不是直接返回false,如果是再繼續比較對應的數值大小。
JDK1.8的源碼如下:
1.Float類重寫了equals方法:
1 public boolean equals(Object obj) {2 return (obj instanceof Float)&& (floatToIntBits(((Float)obj).value) == floatToIntBits(value)); 3 }
2.Double類重寫了equals方法:
1 public boolean equals(Object obj) { 2 return (obj instanceof Double)&& (doubleToLongBits(((Double)obj).value) == doubleToLongBits(value)); 3 }
--------------------------------------------------------------------------------------------------------使用實例------------------------------------------------------------------------------------------------------------------------
①
1 public class Test{ 2 public String name="abc"; 3 public static void main(String[] args){ 4 Test test=new Test(); 5 Test testB=new Test(); 6 System.out.println(test.equals(testB)+","+test.name.equals(testB.name)); //註意test.equals(testB)是兩個對象之間的比較;test.name.equals(testB.name)是String類型的比較
7 }
8 }
【解析】對於對象的比較,使用Object類的比較器如下所示:
1 public boolean equals(Object obj) { 2 return (this == obj); 3 }
沒有重寫equals時,是直接用==判斷的。而String中重寫了equals方法。
隨筆⑦ Java中的比較 ==,equals以及精度對比較的影響