9.28

qixunlu發表於2024-09-28

動手動腦總結:
列舉型別

點選檢視程式碼
public class EnumTest {

	public static void main(String[] args) {
		Size s=Size.SMALL;
		Size t=Size.LARGE;
		//s和t引用同一個物件?
		System.out.println(s==t);  //不是
		//是原始資料型別嗎?
		System.out.println(s.getClass().isPrimitive());//不是
		//從字串中轉換
		Size u=Size.valueOf("SMALL");
		System.out.println(s==u);  //true
		//列出它的所有值
		for(Size value:Size.values()){
			System.out.println(value);
		}
	}

}
 enum Size{SMALL,MEDIUM,LARGE};
其中執行結果為: false false true SMALL MEDIUM LARGE 由此可知:列舉型別不為原始值,可以透過“==”進行比較。 values() 返回列舉類中所有的值 valueOf()方法返回指定字串值的列舉常量 可以透過value:Size.values()進行遍歷。

原碼,補碼,反碼相關知識:
原碼:原碼是最直觀的表示方法,它直接用二進位制數表示一個數,包括正負號。在原碼中,最高位(最左邊的位)是符號位,0 表示正數,1 表示負數。其餘位表示數值本身。例如,十進位制數 +5 的原碼錶示為00000101,而 -5 的原碼錶示為10000101。
反碼:反碼主要用於表示負數。對於正數,其反碼與其原碼相同。對於負數,其反碼是將原碼除符號位外的所有位取反(0 變 1,1 變 0)。例如,十進位制數-5的反碼錶示為11111010。
補碼:補碼是計算機中最常用的表示方法,用於進行二進位制加法運算。對於正數,其補碼與其原碼相同。對於負數,其補碼是其反碼加 1。補碼的一個重要特性是,任何數的補碼加上該數本身,結果總是 0。例如,十進位制數 -5 的補碼錶示為 11111011。
運算子為:
&:如果相對應位都是1,則結果為1,否則為0
|:如果相對應位都是 0,則結果為 0,否則為 1
^:如果相對應位值相同,則結果為0,否則為1
~:按位取反運算子翻轉運算元的每一位,即0變成1,1變成0。
<<:按位左移運算子。左運算元按位左移右運算元指定的位數。

:按位右移運算子。左運算元按位右移右運算元指定的位數。 、
測試程式碼為:

點選檢視程式碼
package Bufanyuan;

public class Test1 {
    public static void main(String[] args) {
        int a = 60; /* 60 = 0011 1100 */
        int b = 13; /* 13 = 0000 1101 */
        int c = 0;
        c = a & b;       /* 12 = 0000 1100 */
        System.out.println("a & b = " + c );

        c = a | b;       /* 61 = 0011 1101 */
        System.out.println("a | b = " + c );

        c = a ^ b;       /* 49 = 0011 0001 */
        System.out.println("a ^ b = " + c );

        c = ~a;          /*-61 = 1100 0011 */
        System.out.println("~a = " + c );

        c = a << 2;     /* 240 = 1111 0000 */
        System.out.println("a << 2 = " + c );

        c = a >> 2;     /* 15 = 1111 */
        System.out.println("a >> 2  = " + c );

        c = a >>> 2;     /* 15 = 0000 1111 */
        System.out.println("a >>> 2 = " + c );
    }
}

執行結果為: a & b = 12 a | b = 61 a ^ b = 49 ~a = -61 a << 2 = 240 a >> 2 = 15 a >>> 2 = 15

Java中的整數使用補碼錶示。這種表示方法可以有效地處理負數,並且簡化了加減運算。在補碼錶示中,負數的計算也變得與正數一致。

同名變數的處理原則。

點選檢視程式碼
package RepetitionX;

public class Test2 {
    private static int X=1;
    public static void  getX(){
        System.out.println(X);
    }
    public static void main(String[] args) {
        int X=2;
        System.out.println(X);
        getX();
    }
}
執行結果為: 2 1 可知在Java中如果在小範圍內變數名與大範圍的重複時。在宣告小範圍內變數名的範圍內,用小範圍內變數名且不影響大範圍的原始值。脫離範圍後使用大範圍的值。

數值變數的值
透過學習知道了Java中的浮點數並不為我們所想的準確值

點選檢視程式碼
package Double;

public class DoubleTest {

    public static void main(String args[]) {
        System.out.println("0.05 + 0.01 = " + (0.05 + 0.01));
        System.out.println("1.0 - 0.42 = " + (1.0 - 0.42));
        System.out.println("4.015 * 100 = " + (4.015 * 100));
        System.out.println("123.3 / 100 = " + (123.3 / 100));
    }
}
執行結果為:
點選檢視程式碼
0.05 + 0.01 = 0.060000000000000005
1.0 - 0.42 = 0.5800000000000001
4.015 * 100 = 401.49999999999994
123.3 / 100 = 1.2329999999999999
可見Java中的浮點數並不是如我們輸入時的準確。 其原因為計算機進行的是二進位制運算,我們輸入的十進位制數字會先轉換成二進位制,進行運算後再轉換為十進位制輸出。 而N進位制可以理解為:數值×基數的冪,Double型別的數值佔用64bit,即64個二進位制數,除去最高位表示正負符號的位,在最低位上一定會與實際資料存在誤差(除非實際資料恰好是2的n次方)。 總結為:在Java中double與flout類為了加快運算,導致在進位制換算上存在一些問題,例如有的數不能完全轉化,只能無限趨近於之個數。

解決辦法為使用BigDecimal類

點選檢視程式碼
package Double;
import java.math.BigDecimal;
public class BigDecimalTest
{
    public static void main(String[] args)
    {
        java.math.BigDecimal f1 = new java.math.BigDecimal("0.05");
        java.math.BigDecimal f2 = java.math.BigDecimal.valueOf(0.01);
        java.math.BigDecimal f3 = new java.math.BigDecimal(0.05);
        System.out.println("使用String構造BigDecimal");
        System.out.println("0.05 + 0.01 = " + f1.add(f2));
        System.out.println("0.05 - 0.01 = " + f1.subtract(f2));
        System.out.println("0.05 * 0.01 = " + f1.multiply(f2));
        System.out.println("0.05 / 0.01 = " + f1.divide(f2));
        System.out.println("使用double構造BigDecimal");
        System.out.println("0.05 + 0.01 = " + f3.add(f2));
        System.out.println("0.05 - 0.01 = " + f3.subtract(f2));
        System.out.println("0.05 * 0.01 = " + f3.multiply(f2));
        System.out.println("0.05 / 0.01 = " + f3.divide(f2));
    }
}
執行結果為:
點選檢視程式碼
使用String構造BigDecimal
0.05 + 0.01 = 0.06
0.05 - 0.01 = 0.04
0.05 * 0.01 = 0.0005
0.05 / 0.01 = 5
使用double構造BigDecimal
0.05 + 0.01 = 0.06000000000000000277555756156289135105907917022705078125
0.05 - 0.01 = 0.04000000000000000277555756156289135105907917022705078125
0.05 * 0.01 = 0.0005000000000000000277555756156289135105907917022705078125
0.05 / 0.01 = 5.000000000000000277555756156289135105907917022705078125

可見使用double構造時仍會出錯,其原因為double型別無法精確的構造BigDecimal物件,及無法精確定位。

相關文章