面白いオートボクシングについてのJava少し何か

免責事項:この記事はブロガーオリジナル記事です、続くBY-SAのCC 4.0を著作権契約、複製、元のソースのリンクと、この文を添付してください。
このリンク: https://blog.csdn.net/weixin_45614509/article/details/102748979

これは、次のコードの結果が実行されているものだと思うし、「Java仮想マシンの深い理解」の本の一例ですか?

    public static void main(String[] args) {
        Integer a = 1;
        Integer b = 1;
        Integer c = 3;
        Integer d = 3;
        Integer e = 138;
        Integer f = 138;
        Long g = 3L;

        System.out.println(c == d);
        System.out.println(e == f);
        System.out.println(c == (a + b));
        System.out.println(c.equals(a + b));
        System.out.println(g == (a + b));
        System.out.println(g.equals(a + b));
    }

私たちが最初にメモリ内の比較アドレスが等しい== ==とオブジェクトの対等の違いを知っている必要があり、これを理解し、それが両者の比較が同じオブジェクトであるかどうか、です。一般的にこの方法は、オブジェクトの内容を比較等しい同じですが、上書きがない場合、equalsメソッドを、まだ比較する==使用し、実際には、道に等しいオブジェクトを呼び出すことです。

これを知ることは見下し続けます。

C == Dの

cおよびdは、しかし3であるが、同じメモリアドレスのc及びd Interger型Interger比較の等価タイプ==比較を使用します。だから私は、結果が偽であると思います。

電子== F
共感

C ==(A + B)

ので、B +の実行時には、整数bが確かに2つのオブジェクトが追加されていない、それは自動的にINTにaとbをアンパックし、その結果は、添加intで整数int型3とタイプ3は確かに同じではありません。だから、推測では、偽であります

c.equals(A + B)

整数値を比較するようにかなり多くのメモリアドレスよりも、同じであるので、結果が真の推測であります

グラム==(A + B)

同様に、偽の推測

g.equals(A + B)

gはロングタイプなので、int型とA + Bの比較結果は確かに偽です。だから、推測では、偽であります


そして、次のような結果である実行します。

true
false
false
false
false
false

2間違ったが、最初のものを見て推測します:

        Integer c = 3;
        Integer d = 3;
        System.out.println(c == d);

Integer c = 3;自動包装機序ので、相当Integer.valueOf(3)Integer d = 3通常共感し、2つの異なるオブジェクトでなければなりませんが、比較結果メモリアドレスが同じであることが判明しました。私たちは、ソースコードに外観を命じました。

    public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }

ああ?IntegerCache一体何?結果cが== D trueで、ソースコードのクリックを見て、なぜあなたが理解できるように、キャッシュの名前が使用されて見ることができます探します。

    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() {}
    }

IntegerCacheアレイはバッファまでの範囲内、すなわち、データバイト、-128と127の間の整​​数を使用する、Integer.valueOfを使用して、各時間がどこからピックアップし、c及びdは、実際にありそうオブジェクト。

c.equals(A + B)

ソースのこのビューには、知っています:

    public boolean equals(Object obj) {
        if (obj instanceof Integer) {
            return value == ((Integer)obj).intValue();
        }
        return false;
    }

INSTANCEOFオブジェクトが結果A + Bと同じであるintは、オブジェクトが属するかどうかを決定するためにソースコードの最初の実行、及び、梱包自動的に行われないobj instanceof Integer状態が直接偽を返し、確立されていません。


実際には1は自動ボクシングとアンボクシングを使用しないでください

おすすめ

転載: blog.csdn.net/weixin_45614509/article/details/102748979