java 参照型の比較を==でやってはいけない

class Main {
  public static void main(String[] args) {

    // Integer(参照型)・・・intのラッパークラス
    Integer i1 = 127;
    Integer i2 = 127;
    System.out.println(i1 == i2); → trueになる

    Integer i3 = 128;
    Integer i4 = 128;
    System.out.println(i3 == i4); → falseになる
  }
}

なぜ127と128で結果が異なるのか知っていますか?

そもそも参照型を「==」で比較してはいけません。

なぜなら参照型を「==」で比較するということは、参照しているアドレスが同じかどうか?を比べているからです。ではなぜ127と128で結果が異なるのでしょうか?理由は、Intgerクラスのソースコードを見ると分かるのですが、-128~127については、キャッシュとして持っています。そのため、127の場合は、キャッシュから返しているため同じアドレスとなるのですが、128を超えると新しいアドレスを取得するため、異なるアドレスとなってしまいます。

キャッシュの範囲内に収まる0,1などフラグや、2桁以内のコード値の時は問題が無いように見えてしまうため問題無いと勘違いが生まれ、バグを生み出してしまう原因になっているように思います。

参照型を比較する場合は、「==」ではなく、「equals」を使いましょう。

System.out.println(i3.equals(i4)); → trueになる

Mapから取得した値を「==」で比較していたら、バグが潜んでいるかも知れません。
※Mapには基本型(プリミティブ型)を入れられないため、参照型を入れることになります。

    Map<String, Integer> map = new HashMap<String, Integer>();
    map.put("first", 128);
    map.put("second",128);
    System.out.println(map.get("first") == map.get("second"));