0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

LinkedHashMapの機能の個人的まとめ (removeEldestEntry、挿入順とアクセス順)

Posted at

はじめに

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の関係性です。このメソッドは以下の順番で呼び出されます。

  1. putが呼び出され、新しいエントリが追加される。
  2. 内部的にremoveEldestEntryが呼び出される
  3. removeEldestEntryがtrueになった場合、もっとも古いエントリを削除する

挿入順とアクセス順

LinkedHashMapには挿入順とアクセス順というふたつのモードが用意されています。コンストラクタの第3引数accessOrderにtrueを設定するとアクセス順、falseを設定すると挿入順です。ちなみデフォルトコンストラクタでLinkedHashMapオブジェクトを生成すると、挿入順になります (accessOrder=false)

アクセス順の場合、以下のすべてでそのエントリを利用したと判定します。

  1. getでそのエントリを取得する
  2. putでそのエントリを更新する
  3. 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)
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?