왜 내 수업이 Java 해시 세트에서 제대로 작동하지 않습니까?
-
11-09-2019 - |
문제
나는 나를 사용하는 프로젝트를 진행하고 있습니다. HashSet
내가 만든 수업 중 Test
. 나는 언급 된 것을 정의했다 HashSet
그렇게 :
HashSet<Test> t = new HashSet<Test>();
t.add(new Test("asdf", 1));
t.add(new Test("hello", 2));
t.add(new Test("hello", 3));
나는 사용을 시도했다
t.contains(new Test("asdf", 1));
그러나 그것은 돌아옵니다 false
. 그러나 내가 사용할 때 HashSet<Character>
잘 작동하는 것 같습니다. 나는 이전을 재정의하려고 시도했다 equals
선언이지만 작동하지 않았습니다. 나는 떠나려고 노력했다 equals
혼자, 그러나 나는 여전히 얻었다 false
. 내가 뭘 잘못하고 있는지 알아야합니까?
또한 해시 함수를 편집하지 않았으며 Test.equals (Object O) 만 변경했습니다. 간단한 프로젝트이며 Java 문서는 O.equals (this)를 사용한다고 말하면 필요하지 않다고 생각했습니다.
해결책
hashcode () 메소드도 과부하해야 할 수도 있습니다.
다른 팁
HashSet.add(Object data)
동일하지 않습니다 HashSet.add(new Test(String, int))
사용하려고 노력하십시오 HashSet.add(new Test("asdf", 1));
. 그리고 hashCode()
방법. 코드가 컴파일됩니까?
코드조차 컴파일하지 않습니다 ...
Hashset에는 두 인수를 허용하는 add () 메소드가 없습니다.
당신이 의미한다면
t.add(new Test("asdf", 1));
대신에
t.add("asdf", 1);
이전에 말했듯이 테스트 클래스의 해시 코드 및 동등한 방법이 올바르게 구현되어 있는지 확인하십시오.
내부적으로 hashtable은 오브젝트#hashcode ()를 사용하여 해시 및 객체를 버킷으로, 객체#equals ()를 사용하여 해시 코드 충돌이있는 경우 평등을 테스트합니다. 테스트 클래스가 문자열 동등성을 테스트하기 위해 테스트 클래스가 적절한 구현 (오버레이드)을 제공하는지 확인해야합니다. 그렇지 않으면 기본 오브젝트#equals () 메소드는 객체 인스턴스 ID (ref id)를 사용합니다. 보다 여기 이 주제에 대한 튜토리얼.