カスタムシリアライザで以前に見たオブジェクトを追跡するアイデンティティハッシュマップを使用しています。私はマップ内のエントリを繰り返し処理しようとするwhileループを持っています。メソッド呼び出し中に、addAllFields
がオブジェクトのマップのキーセットに追加される可能性があります。いくつかのデバッグの後で私は、iterator.hasNext()
が、最後のループ本体の実行以来、オブジェクトがマップに追加されたという事実を知っていても、falseを返すことに気付きました。私はここで間違って何をしていますか?Java ListイテレータがIdentityHashMapで動作しない
public Document serialize(Object obj) throws Exception {
reset();
addToMap(obj);
Set<Object> keys = map.keySet();
Iterator<Object> iterator = keys.iterator();
while(iterator.hasNext()) {
Object key = iterator.next();
Element objectElement = createObjectElement(key.getClass().getName(), map.get(key));
addAllFields(objectElement, key);
document.getRootElement().addContent(objectElement);
}
return document;
}
* "ここで間違っています? "*イタレーション中にマップを変更するng。 ['keySet()'](https://docs.oracle.com/javase/9/docs/api/java/util/IdentityHashMap.html#keySet--)のJavadocによると、*マップが**の場合セットの反復**が進行中に変更されたとき、反復の結果は** undefined **です。* – Andreas
このような未定義の動作がないことが分かっている別のハッシュマップがありますか? –
['ConcurrentHashMap'](https://docs.oracle.com/javase/9/docs/api/java/util/concurrent/ConcurrentHashMap.html)。 ['keySet()'](https://docs.oracle.com/javase/9/docs/api/java/util/concurrent/ConcurrentHashMap.html#keySet--)のJavadocは次のように述べています:*ビューのイテレータとスプライテータ[弱く一貫性があります](https://docs.oracle.com/javase/9/docs/api/java/util/concurrent/package-summary.html#Weakly)*つまり、構築時に存在していた要素をトラバースすることが保証されています正確に1回であり、施工後の変更を反映することがありますが、保証はできません。 – Andreas