1. 程式人生 > >隨筆⑦ Java中的比較 ==,equals以及精度對比較的影響

隨筆⑦ Java中的比較 ==,equals以及精度對比較的影響

情況 數值 數據 his static 作用 進行 返回 浮點數

Java中的比較 ==,equals

① 對於==,如果是作用於基本數據類型的變量,則直接比較其存儲的"值"是否相等;如果是作用於引用類型的變量,則比較的是所指向的對象的地址

② 對於equals方法,註意:equals方法不能作用於基本數據類型的變量

如果沒有對equals方法進行重寫,則比較的是引用類型變量所指向的對象的地址;諸如String,Date等類對equals方法進行了重寫的話比較的是所指向的對象的內容

Float類型值的比較

一般情況下,浮點數是不直接進行判等比較的因為浮點數存在精度問題。要比較兩個浮點數,一般的比較方法是設定一個精度,當二者的差小於某個精度時,認為二者相等

。例如:s,t為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以及精度對比較的影響