技術メモ

神奈川在住のITエンジニアの備忘録。おもにプログラミングやネットワーク技術について、学んだことを自分の中で整理するためにゆるゆると書いています。ちゃんと検証できていない部分もあるのでご参考程度となりますが、誰かのお役に立てれば幸いです。

JavaのIntegerオブジェクトの比較

先日、Listのリストから取得した異なるIntegerオブジェクト同士 (中身のint値は同じ) を「==」で比較するという定番の間違いをしてしまったのだが、なぜか「等しい」と判定された。Javaでは、異なるオブジェクト同士を「==」で比較したら、「等しくない」と判定されるという認識だったので、あれ?何で・・?と思ってちょっと調べてみたところ、以下の記事を見つけた。
http://javatechnology.net/java/integer-equal/

どうやら、Javaでは、-128から127の数値は、Java内部で同一オブジェクトが使われるらしい。つまり、オブジェクト同士の比較を行っても、同一オブジェクトなので「等しい」と判定されるようだ。
以下は、上記を検証した時のサンプル。

        List<Integer> numList = new ArrayList<>();
        numList.add(1);
        numList.add(1);
        numList.add(128);
        numList.add(128);

        if (numList.get(0) == numList.get(1)) { // 良くない比較の方法
            System.out.println("Equal"); // 予想に反して、「等しい」と判定される。
        }
        else {
            System.out.println("Not equal");
        }

        if (numList.get(2) == numList.get(3)) { // 良くない比較の方法
            System.out.println("Equal");
        }
        else {
            System.out.println("Not equal"); // 予想通り、「等しくない」と判定される。
        }

        if (numList.get(2).equals(numList.get(3))) { // 正しい比較の方法
            System.out.println("Equal"); // 「等しい」と判定される。
        }
        else {
            System.out.println("Not equal");
        }
    }

Javaで、-128から127の数値について内部で同一オブジェクトが使われるのは、おそらく、省メモリのためではないかと考えている。よく使われるであろう先の範囲の数値のオブジェクトについては同一のものを使用することで、Integerオブジェクトがたくさん生成されてもJava全体のメモリがあまり増えないようにしているのではないか、と推測している。