Code Fix

上級

Integer の == が 127 までしか動かない理由

-128〜127のキャッシュが原因です。たまたま動く挙動に依存する危険性を扱います。

なぜエラーが出ないのか

出力: false
(エラーなし)
javacは何も報告しません。文法として正しいためです
出力: false
実際の挙動 — 期待した結果と食い違っている箇所
見つけ方
エラーが出ないので、出力を目で確かめるしかありません。この種の誤りが最も発見が遅れます

このエラーが出る典型パターン

パターン1

 1  public class Main {
 2      public static void main(String[] args) {
 3          Integer a = 128, b = 128;
 4          System.out.println(a == b        );
                                      ^
 5      }
 6  }
出力: false期待: true (コンパイルは通っています)

Integerは-128〜127だけキャッシュされ同一実体になります。128以上は別実体なので==がfalseになります。

直し方: a == ba.equals(b) にします。

この問題を解いてみる →

広告
広告スロット(未設定)

パターン2

 1  public class Main {
 2      public static void main(String[] args) {
 3          Integer a = 100, b = 100;
 4          System.out.println(a == b);
                                  ^
 5      }
 6  }
出力: true(127以下なのでたまたま通ります。128にすると false になります)

たまたま動く挙動に依存するのが最も危険です。ラッパー型の比較は常にequalsを使います。

直し方: ==== にします。

この問題を解いてみる →

パターン3

 1  public class Main {
 2      public static void main(String[] args) {
 3          Integer a = 1000;
 4          int b = 1000;
 5          System.out.println(a ==       b);
                                     ^
 6      }
 7  }
出力: true(片方がintだと開封されて値比較になります)

片側がプリミティブなら==は値の比較になります。両側がラッパーのときだけ参照比較になる点が混乱の元です。

直し方: ==== にします。

この問題を解いてみる →

よくある誤解

127以下でテストすると通ってしまいます。テストデータの選び方次第で、本番まで見逃します。

まとめ

Integer の == が 127 までしか動かない理由は上級でつまずきやすい項目です。上の3パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。

演習をはじめる

関連するエラー

広告
広告スロット(未設定)