ホームページ  >  記事  >  Java  >  JavaにおけるIntegerとintの違いの詳細な分析のまとめ

JavaにおけるIntegerとintの違いの詳細な分析のまとめ

php是最好的语言
php是最好的语言オリジナル
2018-08-06 16:37:182376ブラウズ

上記の記事で述べたように、なぜ Java ジェネリックはプリミティブ型ではなくオブジェクトを使用するのでしょうか?でも、Integer と int の違いがまだよくわからないので、Baidu で素晴らしい人の記事を見つけたので、再投稿して共有しました。

Integer と int の違い

Integer は int によって提供されるカプセル化クラスであり、int は Java の基本データ型です。Integer のデフォルト値は null で、int のデフォルト値は 0 です。 Integer として宣言された変数はインスタンス化する必要があり、 int として宣言された変数はインスタンス化する必要がありません。Integer はオブジェクトであり、参照はこのオブジェクトを指しますが、int は基本型であり、値を直接格納します。

Integer と int の最も基本的な違いを知ることに加えて、Integer と int を実際に使用する際に遭遇するその他の問題も知る必要があります。
そうでない場合、インタビュアーが Integer i = 1; int ii = 1; i==ii は true か false かを尋ねた場合、他の質問をすると答えられない人もいると予想されます。皆さんの参考になればと思い、まとめてみました。
コードは次のとおりです:

public class Main {
 
    public static void main(String[] args) {
 
        int a = 128;
        Integer b = 127;
        Integer c = 127;
        Integer d = 128;
        Integer e = 128;
        Integer f = new Integer("128");
        Integer g = new Integer("127");
        Integer h = new Integer("127");
 
 
        //方案一()
        System.out.println("方案一:Integer与new Integer不同初始化方法的值的比较,Integer与new Integer不会相等");
        //Integer e = 128;
        //Integer f = new Integer("128");
        if (e == f){
            System.out.println("true");
        }else{
            System.out.println("false");
        }
        System.out.println("---------------------");
 
        //方案二
        System.out.println("方案二:创建两个都是直接赋值的Integer");
        //Integer b = 127;
        //Integer c = 127;
        if (b == c){
            System.out.println("true");
        }else{
            System.out.println("false");
        }
        //Integer d = 128;
        //Integer e = 128;
        if (d == e){
            System.out.println("true");
        }else{
            System.out.println("false");
        }
        System.out.println("---------------------");
 
        //方案三
        System.out.println("方案三:两个都是new出来的Integer");
        //Integer g = new Integer("127");
        //Integer h = new Integer("127");
        if (g == h){
            System.out.println("true");
        }else{
            System.out.println("false");
        }
        System.out.println("---------------------");
 
        //方案四
        System.out.println("方案四:int与Integer比较");
        //int a = 128;
        //Integer f = new Integer("128");
        if (a == f){
            System.out.println("true");
        }else{
            System.out.println("false");
        }
 
    }
}

実行結果は次のとおりです:

方案一:Integer与new Integer不同初始化方法的值的比较,Integer与new Integer不会相等
false
---------------------
方案二:创建两个都是直接赋值的Integer
true
false
---------------------
方案三:两个都是new出来的Integer
false
---------------------
方案四:int与Integer比较
true

要約は次のとおりです:

オプション 1:
最初に 2 つのオブジェクト e に対して 2 つの異なる初期化メソッド、Integer と new Integer を使用します。 f. 2 つのオブジェクトを比較します。

Integer e = 128;
Integer f = new Integer("128");
 
if (e == f){
    System.out.println("true");
}else{
    System.out.println("false");
}

戻り値: false
結論: Integer と new Integer は等しくありません。 e の参照はヒープを指し、f はそれを格納する専用のメモリ (定数プール) を指します。それらのメモリ アドレスは異なるため、 false になります。

オプション 2:
直接割り当てられる 2 つの整数を作成します。オブジェクト;

//Integer b = 127;
//Integer c = 127;
if (b == c){
    System.out.println("true");
}else{
    System.out.println("false");
}
//Integer d = 128;
//Integer e = 128;
if (d == e){
    System.out.println("true");
}else{
    System.out.println("false");
}

戻り結果:
true
false
結論: 数値が -128 から 127 までの場合は true、そうでない場合は false
理由: Java が Integer i2 = をコンパイルするとき128 は -> Integer i2 = Integer.valueOf(128); に変換され、valueOf() 関数は -128 から 127 までの数値をキャッシュします

皆さん、ソース コードを見てください。 -128 の間の数値は誰でも理解できるでしょう。整数 b = 127 の場合は、127 がキャッシュされます。次回、整数 c = 127 が書き込まれると、それはキャッシュから直接フェッチされます。

/**
     * Cache to support the object identity semantics of autoboxing for values between
     * -128 and 127 (inclusive) as required by JLS.
     *
     * The cache is initialized on first usage.  The size of the cache
     * may be controlled by the {@code -XX:AutoBoxCacheMax=<size>} option.
     * During VM initialization, java.lang.Integer.IntegerCache.high property
     * may be set and saved in the private system properties in the
     * sun.misc.VM class.
     */
 
    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
            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;
        }
 
        private IntegerCache() {}
    }

オプション 3:
最初に 2 つのオブジェクト g と h に新しい Integer 初期化メソッドを使用し、次に 2 つのオブジェクトを比較します。

Integer g = new Integer("127");
Integer h = new Integer("127");
if (g == h){
    System.out.println("true");
}else{
    System.out.println("false");
}

戻り値: false
結論: どちらも新しい点からの Integer オブジェクトです。 2 つの異なる Integer オブジェクト (どちらも false)

オプション 4:
まず、2 つのオブジェクト a と f に対して int と new Integer の 2 つの異なる初期化メソッドを使用し、次にこれら 2 つのオブジェクトを比較します

int a = 128;
Integer f = new Integer("128");
if (a == f){
    System.out.println("true");
}else{
    System.out.println("false");
}

結果を返します。 : true
結論: int と integer (新しいかどうかに関係なく) の比較は、Integer が自動的に int にボックス化されてから比較されるため、true になります

関連記事:

Java チュートリアル - 違いint と Integer の間

Java における int と Integer の違いの詳しい説明

以上がJavaにおけるIntegerとintの違いの詳細な分析のまとめの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。