はじめに
LinkedHashMapはいろいろな機能が用意されています。たまに利用するのですが、そのたびにググって時間を費やしているので、自分用に少しまとめておきます。
removeEldestEntry
removeEldestEntryはputと同時に呼び出されるメソッドで、このメソッドの戻り値がtrueの場合、もっとも古いエントリを削除します。このメソッドは通常、オーバライドして利用します。たとえばエントリ数を最大100個に設定し、それを超えると古いエントリを削除する場合、以下のなコードになります。
new LinkedHashMap<Integer, Integer>() {
@Override
protected boolean removeEldestEntry(java.util.Map.Entry<Integer, Integer> eldest) {
return size() > 100;
}
};
注意したいのはputとremoveEldestEntryの関係性です。このメソッドは以下の順番で呼び出されます。
- putが呼び出され、新しいエントリが追加される。
- 内部的にremoveEldestEntryが呼び出される
- removeEldestEntryがtrueになった場合、もっとも古いエントリを削除する
挿入順とアクセス順
LinkedHashMapには挿入順とアクセス順というふたつのモードが用意されています。コンストラクタの第3引数accessOrderにtrueを設定するとアクセス順、falseを設定すると挿入順です。ちなみデフォルトコンストラクタでLinkedHashMapオブジェクトを生成すると、挿入順になります (accessOrder=false)
アクセス順の場合、以下のすべてでそのエントリを利用したと判定します。
- getでそのエントリを取得する
- putでそのエントリを更新する
- putで新しいエントリを追加する
一方、挿入順の場合、「putで新しいエントリを追加」した場合のみ、エントリを利用した判定とします。
モード | ①getでそのエントリを取得する | ②putでそのエントリを更新する | ③putで新しいエントリを追加する |
---|---|---|---|
アクセス順 | 〇 | 〇 | 〇 |
挿入順 | × | × | 〇 |
環境情報
C:\>javac -version
javac 17.0.5
C:\>java -version
java version "17.0.5" 2022-10-18 LTS
Java(TM) SE Runtime Environment (build 17.0.5+9-LTS-191)
Java HotSpot(TM) 64-Bit Server VM (build 17.0.5+9-LTS-191, mixed mode, sharing)