1

私はConcurrentSkipListMapです。私はkey以下の要素を削除する必要があります。ここでConcurrentSkipListMapのキーとなる要素を削除するには?

は、私はそれを行うことができる方法です。

private ConcurrentNavigableMap<Double, MyObject> myObjectsMap = new ConcurrentSkipListMap<>(); 

//... 

myObjectsMap = myObjectsMap.tailMap(10.25, false); 

はOKに見えますが、私はこれらの事実について混乱しています:

1.

返されるマップはこのマップに連動しています、返されたマップ の変更はこのマップに反映され、その逆もあります。

古い値がガベージコレクタによって削除されないことを意味しますか?
I.古い地図を削除しました。新しい地図が作成されました。しかし、この新しい地図は古い地図に裏付けられています。では、古い地図はどうなりますか?それは取り除かれるのか、それとも永遠に記憶に残るのだろうか?

2.

返されるマップは、その範囲外のキーを挿入しようとする試み にIllegalArgumentExceptionをスローします。

これで、10.25未満で最後の最大値よりも新しい新しいキーを挿入することはできません。

私は混乱しています。どのように正しく私はConcurrentSkipListMapから要素を削除する必要がありますか?

+0

ヘッドの内容を新しいマップにコピーするのが最も安全ではないでしょうか? 'myObjectsMap = new ConcurrentNavigableMap <>(myObjectsMap.headMap(10.25、false));' –

答えて

2

古い値がガベージコレクタによって削除されないことを意味しますか? I.古い地図を削除しました。新しい地図が作成されました。しかし、この新しい地図は古い地図に裏付けられています。では、古い地図はどうなりますか?それは取り除かれるのか、それとも永遠に記憶に残るのだろうか?

はい、実際のところです。古い地図はまだ周りに残っていて、それは周りにとどまるでしょう。あまりにも、元のマップからそれらを削除する - あなたはキー< 10.25を削除にしたい場合は

は、そのすべての要素を削除し、そのサブマップが作成されます

map.headMap(10.25, false).clear(); 
を...行います - - そのサブマップビューを破棄し、ガベージコレクションを行い、キー> = 10.25しか含まない元のマップオブジェクトを残しておきます。

操作が開始されたときに< 10.25のキーが削除されることが保証されていますが、新しいキーが同時に挿入されていないか、後で新しいキーが挿入される可能性があります。あなたはそれについて本当に何もできません。値> = 10.25以上しか操作していないことを確認したい場合は、map.tailMap(10.25, true)を使用しますが、10.25未満の他の値がまだ挿入されている可能性があります。

+0

これはちょうど完璧な答えです。明確化のためにありがとう! – Alexandr

関連する問題