>

equals와 hashcode ()가 제대로 구현되도록하려면 다음 규칙을 확인해야합니다

  • 반사율
  • 대칭
  • 전이성
  • 일관성
  • 무치 개성
그러나 다음 구현은 규칙 일관성을 위반합니다 (필드를 수정하면 x는 절대로 자체와 같지 않습니다).이 테스트를 올바르게 실행하려면 어떻게해야합니까?

public class TestHashCode {
public class Point {
    public int x;
    public int y;
    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }
    public int hashCode() {
        int hash = 3;
        hash = 97 * hash + this.x;
        hash = 97 * hash + this.y;
        return hash;
    }
    public boolean equals(Object obj) {
        // generated code by netbeans IDE
    }
}
@Test
public void testEquals() {
    Point x = new Point(1, 1);
    Set<Point> pointsAsSet = new HashSet<>();
    pointsAsSet.add(x);
    x.x = 3 ;
    Assert.assertTrue(pointsAsSet.contains(x));
}

}


  • 답변 # 1

    HashSet 멤버의 속성을 변경할 수 없습니다  ( equals 의 구현에 참여하는  또는 hashCode ) 작동 할 것으로 예상합니다.

    이러한 속성을 변경하지 말고 HashSet 에서 요소를 제거하십시오.  변경하기 전에 나중에 다시 추가하십시오.

    Point x = new Point(1, 1);
    Set<Point> pointsAsSet = new HashSet<>();
    pointsAsSet.add(x);
    ...
    pointsAsSet.remove(x);
    x.x = 3 ;
    pointsAsSet.add(x);
    ...
    Assert.assertTrue(pointsAsSet.contains(x));
    
    
    대안으로, 당신이 당신의 Point 에 독특한 불변 속성을 가지고 있다면  수업, 당신은 그것을 HashMap 의 열쇠로 사용할 수 있습니다  (예 : HashMap<Integer,Point> ) 그리고 당신은 당신의 Point 가 필요하지 않습니다   equals 를 재정의하는 클래스  그리고 hashCode .

  • 이전 regex - 기존 루트에서 하위 폴더로의 리디렉션을 유지하면서 htaccess가 특정 TLD를 하위 폴더로 리디렉션
  • 다음 javascript - 녹아웃 유형 스크립트 뷰 모델 함수가 정의되지 않았습니다