2016-10-02 7 views
-5

기본 데이터 구조는 기본적으로 Entry의 배열 인 HashMap입니다. 후행 구조가 배열이기 때문에 반복 순서가 시간에 따라 어떻게 변할 수 있습니까?Java *에서 HashSet은 반복하는 동안 순서를 보장하지 않습니다.

+7

기본 가정 (배열 일뿐입니다)은 잘못되었습니다. 해시 테이블 데이터 구조에 대한 Wikipedia 기사를 읽으십시오. –

+0

HashMap은 배열입니다. http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/java/util/HashMap.java#HashMap.0table – user2698

+3

@ user2698을 참조하십시오. 나머지 코드는 보셨습니까? 방법 ... 예를 들면? 그냥 ** 배열이 아니고 다른 것은 없습니다 **. –

답변

2

해시 세트의 반복 순서는 임의이지만 아직 결정적입니다.

순서가 반복 사이에서 변경되지 않는 한 시간의 경과에 따라 순서가 변경되지 않습니다. 동일한 항목 세트와 특정 삽입 순서가 주어지면 반복 순서는 동일하게 유지됩니다.

항목을 삽입하거나 삭제하면 반복 순서가 변경됩니다. 기본 데이터 구조 인 목록 노드의 배열은 동일하게 유지되지만 해시 버킷에 항목을 배치하는 것은 항목의 해시 코드에 의해 결정되므로 해시를 반복 할 때 특정 항목이 어디로 끝날지 알 수 없습니다 세트.

문서는 반복의 순서가 보장되지 않는다는 say 수행합니다

[HashSet]이 세트의 반복 순서에 대해 보증하지 않습니다; 특히 주문이 시간이 지남에 따라 일정하게 유지된다는 것을 보장하지는 않습니다.

"시간 초과"부분은 매우 모호합니다. "시간이 지남에 따라"는 프로그램의 실행 시간을 나타내거나 Java 클래스 라이브러리로 업그레이드하는 시간을 의미하지 않습니다. 또한 반복 순서가 변경되는 동안 수정이 허용되는지는 명확하지 않다.

그러나 해시 집합이 구성되고 구현되는 방식을 알고 있으면 업데이트가없는 경우 반복 순서가 결정적으로 유지 될 확률이 매우 낮습니다. 그것은 언제든지 변경 될 수 있으므로 주문에 의존 할 수 있다는 의미는 아닙니다.

+1

나는 그것이 사실이라고 생각하지 않는다. javadocs에서 : "그것은 세트의 반복 순서에 대한 보장을하지 못하며 특히 시간이 지남에 따라 순서가 일정하게 유지된다는 것을 보장하지 않습니다." 이 문장에서 엘리먼트를 추가/삭제하지 않더라도 반복 순서는 여전히 변할 수 있음을 이해합니다. – user2698

+3

@ user2698 - 글쎄,'HashSet'의 다른 구현을 위해, 그들은 바뀔 수 있습니다! 요점은 javadoc은 코드가 완전히 재 작성 되었더라도 'HashSet'의 과거, 현재 및 미래 버전에 의해 수행 될 계약입니다. 계약서는 "우리가 아직 말할 수없는 상황에서 변화하지 않는 주문에 의존하지 말라."라고 말합니다. –

+3

Oh yes ... 그리고 serialize/deserializing은 새로운 HashSet (set)을 사용하여 복사하는 것과 마찬가지로 반복 순서를 변경하는 경향이 있습니다. –