[解決済み] Javaで整数のラッパーを比較するとき、128==128は偽で、127==127は真なのはなぜですか?
2022-04-22 11:51:32
疑問点
class D {
public static void main(String args[]) {
Integer b2=128;
Integer b3=128;
System.out.println(b2==b3);
}
}
出力します。
false
class D {
public static void main(String args[]) {
Integer b2=127;
Integer b3=127;
System.out.println(b2==b3);
}
}
出力します。
true
注:-128から127までの数値は真となる。
解決方法は?
Javaで数値リテラルをコンパイルしてIntegerに代入すると(大文字の
I
) をコンパイラが出力します。
Integer b2 =Integer.valueOf(127)
このコード行は、オートボックスを使用した場合にも生成されます。
valueOf
は、特定の数値がプールされるように実装されており、128より小さい値に対して同じインスタンスを返します。
java 1.6ソースコード621行目より。
public static Integer valueOf(int i) {
if(i >= -128 && i <= IntegerCache.high)
return IntegerCache.cache[i + 128];
else
return new Integer(i);
}
の値は
high
は、システムプロパティで、別の値に設定することができます。
-Djava.lang.Integer.IntegerCache.high=999
そのシステムプロパティでプログラムを実行すると、trueが出力されます!
明らかな結論は、2つの参照が同一であることを当てにせず、常に
.equals()
メソッドを使用します。
そこで
b2.equals(b3)
は論理的に等しいb2,b3の値すべてに対してtrueと表示します。
なお
Integer
キャッシュがあるのはパフォーマンスのためではなく、むしろ
JLS、セクション 5.1.7
オブジェクトの識別は -128 から 127 までの値に対して行わなければなりません。
整数#valueOf(int) もこの動作を記録しています。
このメソッドは、頻繁に要求される値をキャッシュすることで、空間と時間のパフォーマンスを大幅に向上させることができます。このメソッドは常に -128 から 127 までの範囲の値をキャッシュし、 この範囲外の値もキャッシュすることがあります。
関連
-
この行に複数のマーカーがある - HttpServletResponseが型エラーに解決できない
-
[解決済み] Javaで "UTF-8 "文字列リテラルを取得する場所はどこですか?
-
myeclipseでコンパイルするとAntエラーが発生する javaの例外が発生しました。
-
eclipse で「アクセス制限: タイプ 'HttpServer' は API ではありません」というプロンプトが表示される。
-
プロローグでのコンテンツは禁止されています
-
javaでクラスを作成すると、enclosing classでないように見える
-
maven プラグイン エラー プラグインの実行は、ライフサイクル構成ソリューションの対象外です。
-
[解決済み] Java内部クラスと静的ネストされたクラス
-
[解決済み] 整数の平方根が整数であるかどうかを判断する最速の方法
-
[解決済み] Integer.valueOf(String)による==比較で、127と128で結果が異なるのはなぜですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
java.util.NoSuchElementException 原因解析と解決方法
-
IllegalArgumentException この例外を解決する方法
-
myeclipseでコンパイルするとAntエラーが発生する javaの例外が発生しました。
-
jd-gui Java Exceptionが発生しました。
-
final, finally, finalizeの違いについて話してください。
-
this()の呼び出しはコンストラクタ本体の最初の文でなければならない 例外解決と原因分析
-
node js npm gruntインストール、elasticsearch-head 5.Xインストール
-
Error: java.lang.NoClassDefFoundError: クラス XXXX を初期化できませんでした
-
スレッド "main" で例外発生 java.net.BindException: アドレスは既に使用中です。NET_Bind
-
ローカルリソースのロードが許可されていない場合の解決策