2016-08-03 7 views
2

질문이 있습니다. 그것은 자바 HashSet의 주문을 mantain하지만 내 프로그램Java 해시 세트 및 트리 집합

public static void main(String[] args) { 
    HashSet<Integer> io=new HashSet<Integer>(); 

    Integer io1=new Integer(4); 
    Integer io2=new Integer(5); 
    Integer io3=new Integer(6); 

    io.add(io2); 
    io.add(io3); 
    io.add(io1); 

    System.out.println(io); 
} 

보고는 나에게 줄을 실행하지 않는라는 매번 내가 그것을 실행 설정 명령했다. 왜 이런 일이 일어나는거야?

또 다른 질문은 : 내가 이전 프로그램에서했던 것처럼 (예 : treeset을 사용하는 hashset 대신 내 클래스를 사용하는 Integer를 사용하는 대신) treeset을 구현하면 compareto를 구현해야합니까?

+0

그냥 우연이 ... – user1121883

답변

3

HashSet은 순서를 유지하지 않지만 요소를 인쇄 할 때 순서에 따라 반복해야합니다. HashSetHashMap으로 백업되며, 저장되는 순서대로 요소를 반복합니다. 간단한 예제에서 4,5,6은 bin 4,5,6에 매핑됩니다 (정수의 hashCode는 정수 값이므로). 따라서 오름차순으로 인쇄됩니다.

40,50,60을 추가하려고하면 빈의 기본 초기 개수가 16이므로 다른 순서 ([50, 40, 60])가 표시되므로 해시 코드 40,50,60은 40 % 16 (8), 50 % (16) (2), 60 % (16) (12), 그래서 50 50 TreeSet<SomeCostumClass>로서는

60. 다음 반복의 첫 번째 요소이며,는 하나 SomeCostumClassComparable<SomeCostumClass> 구현하거나 할 Comparator<SomeCostumClass>을 생성자에 전달하십시오.

+0

하나만 구현해야합니까? – User124235

+0

@ user124235 예 – Eran

+0

답변 해 주셔서 감사합니다. – User124235

3

oracle docs에 따라 항상 동일한 주문을받을 것이라고 보증 할 수 없습니다.

이 클래스는 해시 테이블 (실제로는 HashMap 인스턴스)에 의해 지원되는 Set 인터페이스를 구현합니다. 집합의 반복 순서에 대해서는 아무런 보장도하지 않습니다. 특히, 의 주문이 시간 경과에 따라 일정하게 유지된다는 것을 보장하지 않습니다.

+0

나는이 질문에 답하지 않는다고 생각합니다. 문제는 프로그램을 실행할 때마다 동일한 주문을받는 이유는 무엇입니까? 'HashSet'의 문서가 우리가 그렇게 할 것이라는 것을 보장하지는 않습니다. –

1

HashSet은 각각의 개체 hashCode()의 결과에 의해 구동되는 내부 해시 테이블 (https://en.wikipedia.org/wiki/Hash_table)을 유지합니다. 대부분의 객체의 경우 hashCode() 함수는 결정적이므로 동일한 요소의 HashSet을 반복 한 결과는 동일 할 것입니다. 그것이 주문 될 것이라는 의미는 아닙니다. 그러나 Integer의 경우 함수의 hashCode()은 정수 자체를 반환하므로 단일 수준 해시 테이블의 경우 정렬됩니다.