2017-04-12 17 views
-2

내 IDE (eclipse neon)에서 jre 1.8을 실행 중입니다. 아래 스 니펫 코드에서 볼 수 있듯이 equals 메서드를 재정의하는 My Custom 클래스를 개발했습니다. 그것은 내 custom 클래스의 Set에서 removeAll 메서드를 실행할 때 오버라이드 된 버전을 사용하려고하기 때문에 발생합니다.Java 1.8 overridden equals() 콜렉션 removeAll()

jdk 소스 코드를 살펴보면 removeAll 메소드가 contains 메소드를 사용하고 그 결과로 Object 클래스의 equals 메소드를 사용하는지 확인할 수 있습니다.

public class MyClass { 
    private String connectionID; 


    public MyClass(){  
    ... 
    } 


    @Override 
    public boolean equals(Object obj) {  
     if (obj instanceof MyClass){ 
      if (((MyClass)obj).getConnectionID().equalsIgnoreCase(this.getConnectionID())){ 
       return true; 
      } 
     } 
     return false; 
    } 
... 
} 



public class MyClassContainer{ 

    private Set<MyClass> classes = new HashSet<>(); 

    public Set<MyClass> getClasses() { 
     return this.classes ; 
    } 

} 

public class Main(){ 

    private void method(MyClassContainer contClass) { 

    if (true){ 
     Set<MyClass> temp = some valid Set;   
     temp.removeAll(contClass.getClasses()); 
    } 

} 

이 코드를 실행하면 재정의 된 equals 메서드가 호출되지 않는다는 것을 알게됩니다.

무엇이 잘못 되었나요? 제대로 작동하려면

감사

+1

? equals를 오버라이드 (override)하는 경우, 일관성을 유지하려면 hashCode를 오버라이드 (override) 할 필요가 있습니다. 이것은 아마도 당신의 문제 일 것입니다. –

+1

[왜 Java에서 equals 및 hashCode 메서드를 재정의해야합니까?] (http://stackoverflow.com/questions/2265503/why-do-i-need-to-override-the-equals-and) -hashcode-methods-in-java) –

답변

0

, 당신은뿐만 아니라 hashCode를 오버라이드 (override) 할 필요가 : 당신이 사용하는 설정 구현 어떤 종류의

@Override 
public int hashCode() { 
    return Objects.hash(getConnectionID()); 
} 
+0

*주의! equals가'equalsIgnoreCase'를 사용하여 구현된다면 해시 코드는 대소 문자를 구별하지 않아야합니다.이 구현에서는 제공하지 않습니다. 이 경우에는 ID 비교가 실제로 대소 문자를 구분하지 않아야 할 가능성이 매우 높습니다. 그래서 'equals'의 구현은 다음과 같이'return (obj instanceof MyClass) && ((MyClass) obj) .getConnectionID(). equals (this.getConnectionID()));'로 수정 및 단순화 될 수있다. – Holger