yyh-gl's icon

yyh-gl's Tech Blog

技術ネタ中心のブログです。主な扱いはバックエンド技術と設計です。

yyh-gl

1 分で読めます

featured

JavaのIntegerクラスにキャッシュがあることを知る

JetBrains公式アカウントで以下のクイズがポストされていた。
解答の中に以下のツイートを発見。

“Integer cache"なるものがあることを知る。

Integerクラスのキャッシュとは

ドキュメント を見てみる。
(Javaバージョン: 24)

This method will always cache values in the range -128 to 127, inclusive

-128~127の範囲は常にキャッシュされるとのこと。

and may cache other values outside of this range.

ただし、範囲は-128~127ではないときもあるらしい。
どういうときに範囲が変わるのか気になったので調べた↓

キャッシュ範囲を深ぼる

コード を見てみると以下のとおりだった。

// high value may be configured by property
int h = 127;
String integerCacheHighPropValue =
    VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
if (integerCacheHighPropValue != null) {
    try {
        h = Math.max(parseInt(integerCacheHighPropValue), 127);
        // Maximum array size is Integer.MAX_VALUE
        h = Math.min(h, Integer.MAX_VALUE - (-low) -1);
    } catch( NumberFormatException nfe) {
        // If the property cannot be parsed into an int, ignore it.
    }
}
high = h;

java.lang.Integer.IntegerCache.highというプロパティで、 キャッシュ範囲の上限値だけは変更できる。

結論

Integerクラスのキャッシュ範囲は以下のとおり。

  • デフォルトでは-128~127の範囲の値をキャッシュ
  • java.lang.Integer.IntegerCache.highプロパティを設定することで、上限値(high)を127より大きい値に変更可能
  • 下限値(low)は常に-128

このキャッシュ機構を理解しておくことで、 パフォーマンスだけでなくIntegerクラスの同一性(==による比較結果)の挙動についても正しく理解できる。

最近の投稿

About

東京で働くソフトウェアエンジニアです。バックエンドがメインですが、フロントエンドやインフラもさわっています。