2016-09-14 22 views
0

java.util.HashMapでは、メンバー変数modCountは、主に同時変更を検出するために使用されているようです。 その変数をintにする必要があるのですが、これはブールで達成できませんか?java.util.HashMapで、なぜmodcountがブール値ではないのですか?

+0

http://stackoverflow.com/questions/11833058/modcount-in-map-and-list modCountは、マップが変更された回数です。同じことが 'ブール'で終わったのかどうかについては...おそらく、これは内部のフィールドです。おそらくJDKデベロッパだけが本当の説明を提供することができます。 – Tunaki

答えて

5

ブール値ではなく、変更回数を持つことで、複数のイテレータが有効かどうかを同時に追跡できます。

ブール値で変更が追跡された場合、すべてのイテレータが同じ有効状態になる必要があります。カウントは、iteratorが生成されたときにいくつ修正が行われたかを知ることができます。したがって、使用される変更の数が異なる場合、それが無効であることを知るよりも、変更の数が多い場合。そのため、イテレータの一部を有効にし、一部を無効にすることができます。それぞれのイテレータの有効性を手動で更新する必要はありません。

2

ブール値がある場合は、イテレータを呼び出す前にfalseに設定する必要があり、終了したらtrueかどうかを確認します。

しかし、2つのイテレータを作成した場合、またはイテレータを作成してforEachメソッドをコールした場合、2番目のイテレータは再び変数をリセットします。今

Iterator<K> keyIterator = map.keySet().iterator(); 
... 
keyIterator.next(); 
... 
map.put(key,value); 

Iterator<Map.Entry<K,V>> pairIterator = map.entrySet().iterator(); 
... 
keyIterator.next(); 

keyIterator.next()にこの最後の呼び出しがあるため途中でmap.put(key,value)コールで、失敗するはずです。しかし、ブール値をリセットして作業する場合、map.EntrySet().iterator()はブール値フラグをクリアする必要があります。したがって、keyIterator.next()は失敗しません。

整数を使用すると、イテレータが実際にマップの状態を変更しないため、この問題は回避されます。 "古い値"を保持する変数はローカルに保持されているため、他の読者と干渉することはありません。

関連する問題