2016-11-29 7 views
2

자바의 컨테이너에 대해 배우고 있으며 최근에 HashSet이 요소를 순서대로 제공하지 않는다는 것을 읽었습니다. 에 대한 흥미로운 점 Integer 내 임의로 만든 HashSet이 정렬됩니다. 유형을 으로 변경했을 때 인쇄 된 HashSet은 더 이상 정렬되지 않았습니다. 내 질문은 : HashSet은 다양한 유형에 대해 다르게 작동합니까?왜 HashSet이 정렬 되었습니까?

+1

해시 코드에 따라 다릅니다. – SLaks

+0

해시 집합의 순서에 의존하지 마십시오. 당신이 찾은 것은 코드와 해시 기능이 구현 된 것만으로도 우연의 일치입니다. – CollinD

+0

@CollinD 방금 for 루프를 만들고 random.nextInt()를 사용하여 HashSet에 10 000 개의 요소를 넣었습니다. – soommy12

답변

2

HashSet은 내부적으로 HashMap을 사용합니다. HashMap은 각 요소의 hashCode() 메서드를 사용하여 해시 테이블에 요소를 저장합니다.

intdouble를 들어, 다음은 IntegerDouble 클래스로 auto-boxed 있습니다. HashSetint으로 만들면 Integer's hashCode() 메서드가 사용되며 이는 단지 int을 반환합니다. 따라서 int을 추가하면 정렬 된 상태로 저장됩니다. 그러나 double의 경우 Double's hashCode() 메서드는 복소수가 메모리에 표시되는 방식 때문에 훨씬 더 복잡합니다.

+0

에서 확인할 수 있습니다. 이는 정수 값의 특정 작은 범위 . – Holger

1

두 해시를 해싱하면 Java는 메모리를 두 비트 모두 64 비트 값으로 변환하기 때문에이 코드를 두 번째로 변환합니다.

해시 코드를 실제로 실험하여 정수 및 배가 어떻게 작동하는지 확인할 수 있습니다.

자세한 내용 확인 : Hash a double in Java