1. 程式人生 > >java中幾個常見的問題

java中幾個常見的問題

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)的方式,因為該方法存在精度丟失的風險