사용자 지정 직렬화 기에서 이전에 본 개체를 추적하기 위해 ID 해시 맵을 사용하고 있습니다. while 루프를 사용하여 맵의 항목을 반복합니다. 메서드를 호출하는 동안 addAllFields
개체가지도의 키 집합에 추가 될 수 있습니다. 일부 디버깅을 한 후 내 iterator.hasNext()
반환 사실을 알고있는 경우에도 그 개체가 마지막 루프 본문 실행 이후 맵에 추가 된 것으로 나타났습니다. 여기서 내가 뭘 잘못하고 있니?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;
}
* "내가 뭘 잘못 했니? ? "iterati 동안지도 수정하기 ng. ['keySet()']의 Javadoc (https://docs.oracle.com/javase/9/docs/api/java/util/IdentityHashMap.html#keySet--)은 다음과 같이 말합니다 : *지도가 ** 인 경우 집합에 대한 반복 **이 진행되는 동안 수정 된 반복 결과는 ** undefined **입니다. * – Andreas
이러한 정의되지 않은 동작이없는 다른 해시지도가 있습니까? –
['ConcurrentHashMap'] (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/ConcurrentHashMap.html#keySet--)은 다음과 같이 말합니다 : * 뷰의 반복자와 spliterators [weakly consistent] (https://docs.oracle.com/javase/9/docs/api/java/util/concurrent/package-summary.html#Weakly) * 즉, 구성 요소가 존재할 때 요소를 통과하도록 보장됩니다. 정확히 한 번, 그리고 건설 후 수정 사항을 반영 할 수는 있지만 보장 할 수는 없습니다. – Andreas