データ型のIntegerとint

9114 ワード

データ型のIntegerとint
Java入門 
基本データ型
Javaはオブジェクト向けの言語であり、すべてがオブジェクトであることはよく知られています.しかし、人間の根強いデータ処理習慣と互換性を備え、従来のデータの処理速度を速めるために、9種類の基本データ型が提供され、オブジェクトの特性を備えず、属性や行為がない.Javaの9つの基本データ型にはboolean、byte、char、short、int、long、double、refvarが含まれています.最初の8つのデータ型は、生活の真偽、文字、整数、小数を表し、最後のrefvarはオブジェクト世界向けの参照変数であり、参照ハンドルとも呼ばれます.ここでは、基本的なデータ型でもあると考えられます.上位8種類に対応するパッケージデータ型があり、charの対応パッケージクラス名はCharacter、intはIntegerのほか、すべての対応するパッケージクラス名は頭文字を大文字にすればよい.これら8種類の基本データ型の空間占有サイズ(bit)や対応するパッケージクラスなどの情報を以下に示す.
  • boolean/1/Boolean
  • byte/8/Byte
  • char/16/Character
  • short/16/Short
  • int/32/Integer
  • float/32/Float
  • long/64/Long
  • double/64/Double

  • 梱包タイプ
    最初の8つの基本データ型には、Javaの設計理念がすべてオブジェクトであるため、hashCode()がハッシュ値を取得したり、getClassがクラスを取得したりするなど、オブジェクトの形式で操作する必要がある場合が多い.パッケージクラスの存在は、汎用タイプパラメータ、シーケンス化、タイプ変換、高周波区間データキャッシュなど、基本データ型ではできないことを解決します.最後に重要なのはキャッシュプールです
    キャッシュプール
    実際にはFloatとDoubleを除いて、他のパッケージタイプがキャッシュされます.次に、Integerを紹介する方法でキャッシュについて説明します.まずコードを見てみましょう
    new Integer(123);
    Integer.valueOf(123);
    

    新Integer(123)とInteger.valueOf(123)の違いは、
  • new Integer(123)は、毎回オブジェクト
  • を新規作成します.
  • Integer.valueOf(123)はキャッシュプール内のオブジェクトを使用し、複数回呼び出すと同じオブジェクトの参照が得られます.

  • valueOf()メソッドのソースコード.
    public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }
    

    上記のソースコードのように、付与データiは、キャッシュ区間内でキャッシュプール内のIntegerオブジェクトに直接戻り、そうでなければnewオブジェクトとなる.このため、比較すると次のような問題が発生します.
    public class TestIntegerCache {
        public static void main(String[] args) {
            Integer i1 = 100;
            Integer i2 = 100;
            System.out.println(i1 == i2);
            //true
    
            Integer i3 = 500;
            Integer i4 = 500;
            System.out.println(i3 == i4);
            //false
            System.out.println(i3.equals(i4));
            //true
        }
    }
    
    

    したがって、すべてのパッケージタイプオブジェクト間の比較を推奨し、equalsメソッドをすべて使用します.
    Java 8では、Integerキャッシュプールのサイズはデフォルトで-128~127です.
    static final int low = -128;
    static final int high;
    static final Integer cache[];
    
    static {
        // high value may be configured by property
        int h = 127;
        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;
    
        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;
    }
    

    基本タイプに対応するバッファ・プールは次のとおりです.
  • boolean values true and false
  • all byte values
  • short values between -128 and 127
  • int values between -128 and 127
  • char in the range\u0000 to\u007F

  • 関連参考:StackOverflow:Differences between new Integer(123)、Integer.valueOf(123)、and just 123