Integerとint変換の違い!一般的なインタビューの質問

転載https://www.cnblogs.com/liuling/archive/2013/05/05/intAndInteger.html

Integerとintの比較についてどのくらい知っていますか?

インタビュアーがIntegerとintの違いを尋ねた場合:ほとんどの人は2つのことしか言わないと推定されます。Ingeterはintのパッケージクラスであり、intの初期値は0で、Ingeterの初期値はnullです。しかし、インタビュアーがInteger i = 1を要求した場合、int ii = 1; i == iiは真か偽か 答えられない方もいらっしゃると思われますが、他の人に聞いてみると混乱する方が多いと推定されます。だから私はそれらを要約し、みんなを助けたいと思っています。

package com.test;

public class TestInteger {

    /**
     * @param args
     */
    public static void main(String[] args) {
        int i = 128;
        Integer i2 = 128;
        Integer i3 = new Integer(128);
        //Integer会自动拆箱为int,所以为true
        System.out.println(i == i2);
        System.out.println(i == i3);
        System.out.println("**************");
        Integer i5 = 127;//java在编译的时候,被翻译成-> Integer i5 = Integer.valueOf(127);
        Integer i6 = 127;
        System.out.println(i5 == i6);//true
        /*Integer i5 = 128;
        Integer i6 = 128;
        System.out.println(i5 == i6);//false
*/        Integer ii5 = new Integer(127);
        System.out.println(i5 == ii5); //false
        Integer i7 = new Integer(128);
        Integer i8 = new Integer(123);
        System.out.println(i7 == i8);  //false
    }

}

まず、17行目と18​​行目の出力結果はどちらも真です。これは、Integerとintの比率が自動的にボックス解除されるためです(jdk1.5以上)。

22行目の結果はtrueで、25行目の結果はfalseです。実際、Integer i5 = 127をコンパイルすると、javaは-> Integer i5 = Integer.valueOf(127);に変換されるため、重要なのはvalueOf()関数を確認することです。valueOf()関数のソースコードを見て理解してください。JDKソースコードのvalueOf関数は次のようになります。

 

public static Integer valueOf(int i) {
        assert IntegerCache.high >= 127;
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }
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() {}
    }

 

ソースコードを見ると、-128から127までの数値がキャッシュされることは誰でも理解できます。Integeri5 = 127の場合、127がキャッシュされます。次にInteger i6 = 127が書き込まれるとき、キャッシュから直接取得されます。 、新品ではありません。したがって、22行目の結果は真であり、25行目は偽です。

27行目と30行目では、オブジェクトが異なるため、falseです。

上記の状況の私の要約は次のとおりです。

  ①いずれの場合でも、整数と新しい整数は等しくありません。ボックス化解除プロセスは行われず、i3の参照はヒープを指し、i4は特別なメモリ(定数プール)を指し、それらのメモリアドレスは異なるため、falseです
  。②両方が新しい整数ではない場合、数値が128から127まではtrue、それ以外の場合はfalseです
  。Integeri2 = 128をコンパイルすると、-> Integer i2 = Integer.valueOf(128);に変換され、valueOf()関数は-128から127になります。
  ③の間の数をキャッシュします両方とも新しい、両方とも偽です
  ④整数と整数の比率(新しいかどうかにかかわらず)は真です。

 

何かが間違っていると思われる場合は、指示を歓迎します。

 

 

公開された13件の元の記事 いいね3 訪問4996

おすすめ

転載: blog.csdn.net/u010919402/article/details/93672899