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 == b を a.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パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。