자바 equals 예제

“동일하지 않음”을 인쇄하는 이유는 간단합니다 : c1과 c2를 비교할 때 c1과 c2가 동일한 개체를 참조하는지 여부를 검사합니다 (개체 변수는 항상 Java에서 참조됨). c1 및 c2는 두 개의 서로 다른 개체를 참조하므로 값(c1 == c2)은 false입니다. 우리가 다음과 같이 c3를 말하는 다른 참조를 만들면 (c1 = = c3)이 true를 줄 것입니다. 우리는 소득을 기대할 것입니다.동등한 (비용) 사실 반환. 그러나 현재의 형태로 Money 클래스로, 그것은하지 않습니다. 두 번째 equals() 메서드 비교에서 해시코드() 메서드는 재정의Homer 변수에 대해 재정의됩니다. 이름은 두 Simpson 개체에 대해 “Homer”이지만 해시 코드() 메서드는 재정의된 Homer에 대해 다른 값을 반환합니다. 이 경우 메서드에 해시 코드와의 비교가 포함되어 있으므로 equals() 메서드의 최종 결과는 false입니다. 첫 번째 equals() 메서드 비교에서 개체의 상태가 정확히 같고 hashcode() 메서드가 두 개체에 대해 동일한 값을 반환하기 때문에 결과가 true입니다. 구체적인 클래스를 확장하고 새 중요한 필드를 추가하면 어떻게 됩니까? 조슈아 블로흐에 의해 효과적인 자바에 따르면, 그것은 새로운 클래스에 대한 완벽하게 올바른 동등한 방법을 작성하는 것은 불가능하다. 대신 상속 대신 컴포지션을 사용해야 합니다. 문자열 필드 firstName 및 lastName을 가진 클래스 Person의 경우, 이것은 동일을 구현하는 일반적인 변형이 될 것입니다: 언뜻 보기에 Voucher 클래스와 equals()에 대한 재정의가 올바른 것 같습니다. 그리고 두 가지 모두 () 우리가 돈 또는 바우처에 돈을 비교하는 한 올바르게 행동합니다.

그러나 이 두 개체를 비교하면 어떻게 될까요? 우리는 ID (동일한 참조여야합니다, ==로 확인됨)와 같음 (“동일한 값”에 대한 다른 참조일 수 있음; 같음으로 확인됨)의 차이점에 대해 논의하고 동일을 구현하는 방법을 자세히 살펴보았습니다. 클래스 Object에서 equals()의 기본 구현은 같음이 개체 ID와 동일하다고 말합니다. 그리고 수입과 지출은 두 가지 별개의 사례입니다. 고유 요소만 집합에 삽입할 수 있으므로 HashSet 클래스에 요소를 추가하려면 먼저 equals() 및 해시코드() 메서드를 사용하여 요소가 고유한지 확인해야 합니다. 이 경우 equals() 및 hashcode() 메서드가 재정의되지 않으면 코드에 중복 요소를 삽입할 위험이 있습니다. 집합은 equals() 및 해시코드()를 사용하는 유일한 컬렉션이 아닙니다. 해시맵, 해시테이블 및 LinkedHashMap에도 이러한 메서드가 필요합니다. 일반적으로 “해시”의 접두사가 있는 컬렉션이 표시되면 해당 기능을 제대로 작동하려면 해시코드() 및 equals() 메서드를 재정의해야 하는지 확인할 수 있습니다.

복제() 메서드(개체의 복사본)에 의해 만들어진 개체는 복제본이 만들어진 이후 원본과 복제본이 모두 변경되지 않은 경우 equals() 테스트를 통과해야 합니다. 그러나 복제본이 원래 개체에 ==가 되지 않습니다. 마지막으로 equals()는 개체의 필드를 비교합니다. 두 개체에 동일한 필드 값이 있는 경우 개체는 동일합니다. 이 예제에서는 두 참조 x와 y에 대해 x == y가 true일 때 x.equals(y)도 true이지만 그 반대가 항상 그렇지는 않음을 보여 드리겠습니다. BasicEquals예:라는 클래스 만들기 다음 소스 코드: 두 번째 비교에서 equals()는 전달된 개체가 null인지 또는 다른 클래스로 입력되었는지 확인합니다.