HackerQuest

No app, no life

趣味と実益を兼ねてプログラマをやっている者👨‍💻

【Java】Integer a = 10, b =10; a == b は true or false ?

f:id:tsudukihashi0817:20190416212354p:plain

問題 1

public class Main {
    public static void main(String[] args) {
        Integer a = 10;
        Integer b = 10;
        System.out.println(a == b);
    }
}

出力結果は true or false どちらだと思いますか?

正解は...

true

解説は次の問題の後で!

問題 2

public class Main {
    public static void main(String[] args) {
        Integer a = 1000;
        Integer b = 1000;
        System.out.println(a == b);
    }
}

出力結果は true or false どちらだと思いますか?

正解は...

false

全問正解できましたか?

正解できた方は、JVMの気持ちを理解していて素晴らしいと思います。
自分は間違えました。

解説もどき

JVMはメモリを節約しようと、常日頃から努力しています。

Integerの小さい値がよく使われていることを発見しました。

ある程度の数字なら自分たちであらかじめ用意しておいて、いくつもメモリを使用させないようにしようとしました。

ある程度と言うのは、1バイト(8bit)までです。

-127から127までの数字はJVM内部で保持されています。

そのため

public class Main {
    public static void main(String[] args) {
        Integer a = -127;
        Integer b = -127;
        System.out.println(a == b);
    }
}

true

です。

と言うことは

public class Main {
    public static void main(String[] args) {
        Integer a = 128;
        Integer b = 128;
        System.out.println(a == b);
    }
}

false

になります。

1000は8bit以上なのでfalseと言うことになります。

まとめ

  • JVMは8bitまでの数字を内部に保持している

  • JVMの気持ちを理解してあげよう




Ryo Tsuzukihashi