java中幾個常見的問題
阿新 • • 發佈:2019-07-16
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)的方式,因為該方法存在精度丟失的風險