j java基本データ型を深く理解する

5081 ワード

Javaデータ型の詳細な理解
JAvaは強いタイプの言語であり、宣言変数ごとにタイプを宣言する必要があることを意味します.Javaでは、合計8種類のデータ型があり、そのうち4種類の整数型、2種類の浮動小数点型、1種類の文字型、真の値を表すbooleanタイプがあります.
1.整形
整数は小数部のない整数部を表すために使用され、javaは以下の表に示す4つの整数を提供します.
を選択します.
ストレージ・サイズ
値範囲
int
4バイト
-2^31 ~ 2^31 - 1
short
2バイト
-2^15 ~ 2^15 - 1
long
8バイト
-2^63 ~ 2^63 - 1
byte
1バイト
-2^7 ~ 2^7 - 1
しかしjavaはオブジェクトに面する言語であるため、基本タイプのjavaにもそのパッケージタイプがある:Integer,Short,Long,Byte.
自動梱包と自動解体
基本データ型を柔軟に変更するためにjavaは自動梱包と自動解体を採用しています.次のようになります.
        Integer i = 9;    //   
        int a = i;        //   

梱包とは、基本タイプを自動的に梱包機タイプに変換し、梱包機タイプを自動的に基本データタイプに変換することです.ではjavaはどのようにして自動梱包と自動解体を実現したのでしょうか.逆コンパイルしてみましょう.
  public static void main(java.lang.String[]);
    Code:
       0: bipush        9
       2: invokestatic  #2                  // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
       5: astore_1
       6: aload_1
       7: invokevirtual #3                  // Method java/lang/Integer.intValue:()I
      10: istore_2
      11: return

逆コンパイルの命令から、自動梱包はvalueofメソッドを呼び出し、解体はintValueメソッドを呼び出し、探究の精神に基づいてソースコードを見てみましょう.
  public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)    //      Integer    
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }

明らかにnew Integer(i)に戻ったが、前に判断して、IntegerCacheクラスを見に行きます.
private static class IntegerCache {
        static final int low = -128;    //        
        static final int high;          //        
        static final Integer cache[];   //     

        static {
            // high value may be configured by property
            //     ,  high             
            int h = 127;                //     127
            
            //            high   
            String integerCacheHighPropValue =
                sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
            if (integerCacheHighPropValue != null) {
                try {
                    int i = parseInt(integerCacheHighPropValue);
                    i = Math.max(i, 127);
                    // Maximum array size is Integer.MAX_VALUE
                    h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
                } catch( NumberFormatException nfe) {
                    // If the property cannot be parsed into an int, ignore it.
                }
            }
            //      ,    
            high = h;

            //    [-128,127]         
            cache = new Integer[(high - low) + 1];
            int j = low;
            for(int k = 0; k < cache.length; k++)
                cache[k] = new Integer(j++);

            // range [-128, 127] must be interned (JLS7 5.1.7)
            assert IntegerCache.high >= 127;
        }

ソースコードを見たことがあります.私たちは箱詰めの原理を知っています.Integerのキャッシュメカニズムも知っています.だから、よくあるテーマを出しました.それはIntegerサイズの比較です.
        for (int i = -200; i <= 200; i++){
            Integer a = i;
            Integer b = i;
            System.out.println("a = " + a + ", b = " + b + ", a == b: " + (a == b));
        }

答えも明らかで、あなたはとっくに知っていると信じて、区間[-128,127]の値の比較はすべてtrueで、その他はすべてfalseです.もちろん箱詰めの場合の比較だけがそうであり、他の場合、int a=1、int b=1またはInteger a=new Integer(1)、Integer b=new Integer(1)は一般的な状況に従ってそれぞれtrueとfalseである.したがって、Long、Characterなども同様ですが、このキャッシュメカニズムは浮動小数点タイプには適用されません.1.0から2.0までの小数点数を考えてみてください.無数!では、なぜキャッシュメカニズムを採用するのでしょうか.キャッシュである以上,取数のたびにnew 1つのオブジェクトが必要になることを回避し,損失を減らすためである.また、intタイプが最も多く使用されているため、使用するたびに同じオブジェクトが繰り返し使用されます.
JAvaのプラットフォーム間でのjavaのサポート:
「1回のコンパイル、あちこちで実行」の理想を実現するために、javaの整数型の範囲はjavaを実行する機械とは関係なく、ソフトウェアが1つのプラットフォームから別のプラットフォームに移植される多くの問題を解決します.ソフトウェアが32ビットマシンで正常に動作し、16ビットマシンで動作すると問題が発生するため、各タイプの値範囲は固定されています.
2.浮動小数点タイプ
浮動小数点タイプは小数点の数値を表し、javaには次の2つの浮動小数点タイプがあります.
を選択します.
ストレージ・サイズ
値範囲
float
4バイト
約±3.40282346638528860 e+38(有効数7ビット)
double
8バイト
約±1.7976931348623570 e+308(有効数15ビット)
(注:値範囲はIEEE 754浮動小数点の「二重精度フォーマット」ビットレイアウトに従って指定された浮動小数点値の表示形式に戻り、NaN値を保持します.63位(マスク0 x 8000000000 Lで選択されたビット)は浮動小数点数の符号を表します.62-52位(マスク0 x 7 ff 00000000 Lで選択されたビット)は指数を表します.51-0位(マスク0 x 000 fffffffffffffL選択ビット)浮動小数点数を表す有効数字(端数とも呼ばれる場合がある)
  • 浮動小数点値は、丸め誤差のある金融計算には適用されません.例えば、・・・System.out.println(2.0-1.1);・・結果は
  • となります.
    0.8999999999999999

    ではなぜ0.9ではないのでしょうか.浮動小数点値はバイナリで表され、バイナリシステムでは1/10を正確に表すことができないためです.正確な演算を行うにはBigDecimalクラスを使用するのが望ましいです
    public static void main(String[] args) {
           BigDecimal a = new BigDecimal("2.0");
           BigDecimal b = new BigDecimal("1.1");
           System.out.println(a.subtract(b));
        }

    結果
    0.9

    3.まとめ
  • 梱包は、基本データ型を自動的に梱包機タイプに変換し、解体は自動的に梱包機タイプを基本データ型に変換する.
  • およびcharタイプは、自動的に箱詰めされ、数値が[-128,127]のとき、newオブジェクト
  • ではなく、キャッシュ配列内の対応する値を返す.
  • 正確な演算で浮動小数点タイプを使用するのではなく、BigDecimalクラス
  • を使用します.