1. ホーム
  2. java

[解決済み] なぜ Integer クラスは -128 から 127 までの値をキャッシュするのですか?

2023-07-09 08:42:30

疑問点

前回の質問について。 Integer.valueOf(String)を使った==比較で、127と128で結果が異なるのはなぜですか? についてですが、私たちは次のことを知っています。 Integer class の間の値を保存するキャッシュがあることがわかります。 -128 .

ただ、不思議なのは、なぜ の間にあるのでしょうか? ?

Integer.valueOf()のドキュメント は、それが " 頻繁にリクエストされる値をキャッシュする "。 . しかし 127-128 が頻繁にリクエストされるのは本当?と思いきや 頻繁に要求される値 は非常に主観的です。

この背景には何か理由があるのでしょうか?

ドキュメントからも記載されています。 " ...そして、この範囲外の他の値をキャッシュすることがあります。 "

これはどのように実現できるのでしょうか?

どのように解決するのですか?

ちょっと不思議なのですが、なぜ -128 と 127 の間なのでしょうか?

より大きな整数の範囲 かもしれない はキャッシュされますが、少なくとも-128と127の間のものは で義務づけられているため、キャッシュされなければなりません。 Java 言語仕様 で義務づけられているからです (強調)。

ボックス化される値pが、真、偽、バイト、または、Ⓐ~Ⓑの範囲内の文字、または 128から127までのintまたはshortの数値。 とすると、r1 と r2 は p の任意の2つのボクシング変換の結果であるとします。

この要求の根拠は同じ段落で説明されています。

理想的には、与えられたプリミティブ値pをボクシングすることで、常に同一の参照 . 実際には、これは既存の実装技術では実現不可能な場合があります。上記のルールは実用的な妥協点です。上記の最終節では、特定の共通値を常に区別できないオブジェクトにボックス化することを要求している。[...]

これにより、特に小さなデバイスで過度のパフォーマンスペナルティを課すことなく、ほとんどの一般的なケースで、望ましい動作になることが保証されます。 . メモリ制限の少ない実装では、たとえば、-32K から +32K までの範囲の int および long 値と同様に、すべての char および short 値をキャッシュすることができます。


この範囲外の値をキャッシュするにはどうすればよいですか。

を使用することができます。 127 のリストではあまり文書化されていない JVM オプションです。 利用可能なホットスポットのJVMオプション . しかし の中のコメントは -XX:AutoBoxCacheMax クラス内のコメントで言及されています。 :

キャッシュの大きさは Integer オプションで制御できます。

これは実装に依存し、他のJVMでは利用できないかもしれないことに注意してください。