1.正確使用equals方法
Object的equals方法容易拋出空指針異常,應使用常量或確定有值的對象來調用equals方法
例如:
//不能使用一個值為null的引用類型變量來調用非靜態方法,否則會拋出異常
String str = null;
if (str.equals("java")) {
...
}
else {
...
}
如果運行上面的程序則會拋出空指針異常,但是我們把第二行的條件判斷語句改為下面這樣的話,就不會拋出空指針異常,else語句可以得到執行:
String str = null;
if ("java".equals(str)) {
...
}
else {
...
}
但是更推薦用java.util包下的Objects類中的equals方法來判斷:
Objects.equals(null, "java);
Objects的equals方法源碼如下所示:
public static boolean equals(Object a, Object b) {
// 可以避免空指針異常,如果a==null就不會執行到a.equals(b)
return (a == b) || (a != null && a.equals(b));
}
2.整型包裝類值的比較
所有整型包裝類值的比較必須使用equals方法
例如:
Integer x = 3;
Integer y = 3;
System.out.println(x == y); // true
Integer a = new Integer(3);
Integer b = new Integer(3);
System.out.println(a == b); // false
System.out.println(a.equals(b)); // true
當使用自動裝箱方式創建一個Integer對象並且數值在-127 - 128時,會將創建的Integer對象緩存起來,當下次再次出現該值時,直接從緩存中取出對應的Integer對象,所以x和y引用的是相同的Integer對象。
當如果想比較整型包裝類的值時,因為a和b是不同的對象,所以用“==”比較的地址返回的是false,此時應當用equals方法進行比較。
3.BigDecimal
3.1 BigDecimal的用處
浮點數之間的等值判斷,基本數據類型不能用==來比較。具體原理和浮點數的編碼方式有關,這里就不再多提。
float a = 1.0f - 0.9f;
float b = 0.9f - 0.8f;
System.out.println(a); // 0.100000024
System.out.println(b); // 0.099999964
System.out.println(a == b); // false
上述結果是由於浮點數的精度丟失引起的,那么我們應該如何解決這個問題呢?一種很常用的方法就是:使用BigDecimal類來定義浮點數的值,再進行浮點數的運算操作。
BigDecimal a = new BigDecimal("1.0");
BigDecimal b = new BigDecimal("0.9");
BigDecimal c = new BigDecimal("0.8");
BigDecimal x = a.subtract(b); // 0.1
BigDecimal y = b.subtract(c); // 0.1
System.out.println(x == y); // true
3.2 BigDecimal的比較
a.compareTo(b):返回-1表示小於,0表示相等,1表示大於。
BigDecimal a = new BigDecimal("0.9");
BigDecimal b = new BigDecimal("0.8");
System.out.println(a.compareTo(b)); // 1
3.3 BigDecimal保留幾位小數
通過setScale()方法設置保留幾位小數以及保留規則。
BigDecimal a = new BigDecimal("1.255433");
BigDecimal b = a.setScale(3, BigDecimal.ROUND_HALF_DOWN);
System.out.println(b); // 1.255
3.4 BigDecimal的使用注意事項
我們在使用BigDecimal時,為了防止精度丟失,推薦使用它的BigDecimal(String)的構造方法來創建對象,或者使用BigDecimal的valueOf方法,而不能使用BigDecimal(double)的方式,因為該方法存在精度丟失的風險。