객체 클래스의 동등한 메소드는 객체가 다른 객체와 같은지 여부를 감지하는 데 사용됩니다. 객체 클래스 에서이 메소드는 두 객체가 동일한 참조를 갖는지 여부를 결정합니다. 두 객체의 참조가 동일한 경우 동일해야합니다. 이 관점에서 기본 작업으로 사용하는 것이 합리적입니다. 그러나 대부분의 수업 에서이 판단은 의미가 없습니다. 예를 들어, 두 인쇄 스트림이 이런 식으로 동일했는지 여부를 비교하는 것은 완전히 의미가 없습니다. 그러나 종종 두 개체의 상태의 평등을 감지해야합니다. 두 객체의 상태가 동일하면 두 객체는 동일하게 간주됩니다. 따라서 일반적으로 동등한 비교는 사용자 정의 클래스에서 다시 작성해야합니다.
다음은 완벽한 equals () 메소드를 작성하기위한 몇 가지 제안입니다.
(1) 명시 적 매개 변수의 이름은 OtherObject로 명명되었으며 나중에 다른 변수로 변환해야합니다.
(2)이과 다른 관점이 동일한 개체를 참조하는지 여부를 감지합니다.
if (this == OtherObject) true를 반환합니다.
이 진술은 최적화 일뿐입니다. 사실, 이것은 종종 채택되는 형태입니다. 이 방정식을 계산하는 것은 클래스의 필드를 하나씩 비교하는 것보다 훨씬 저렴하기 때문입니다.
(3) 다른 객체가 null인지 확인하고 널 여부를 확인하십시오. 이 테스트가 필요합니다.
if (otherObject == null) false를 반환합니다.
(4) 이것과 다른 관점이 같은 클래스에 속한 지 비교하십시오. 동등한 의미론이 각 서브 클래스에서 변경되면 getClass ()를 사용하여이를 감지하여 대상 클래스로 사용됩니다.
if (getClass ()! = OtherObject.getClass ()) false를 반환합니다.
모든 서브 클래스에 동일한 의미가있는 경우 인스턴스의 감지를 사용하십시오.
if (! (!
(5) OtherObject를 해당 유형의 변수로 변환합니다.
ClassName Other = (ClassName) OtherObject;
(6) 이제 비교해야 할 모든 도메인을 비교하기 시작하십시오. 기본 유형 도메인을 비교하고 동일하게 사용하여 객체 도메인을 비교합니다. 모든 필드가 일치하는 경우 true를 반환하십시오. 그렇지 않으면 false를 반환하십시오.
return field1 == Other.field1 && field2.equals (기타 .Field2)
서브 클래스로 Equals가 재정의 된 경우 Call Super.equals (기타)를 포함시켜야합니다. 탐지가 실패하면 평등 한 것은 불가능합니다. 슈퍼 클래스의 도메인이 동일하면 서브 클래스의 인스턴스 도메인을 비교하십시오.
배열 유형 필드의 경우 정적 배열을 사용하여 해당 요소가 동일한지 여부를 감지 할 수 있습니다.
문자열의 비교 예를 살펴 보겠습니다.
문자열 a = "abc"; 문자열 b = "abc"; 문자열 c = 새 문자열 ( "ABC"); 문자열 d = 새 문자열 ( "abc"); System.out.println (a == B); // 문자열 상수가 Java에서 공유되기 때문에 true는 하나의 사본 시스템 만 있습니다. out.println (a == c); // false a와 c는 2 개의 다른 객체 system.out.println (a.equals (c))에 속합니다. // String 객체의 동등한 메소드가 객체의 값을 비교하기 때문에 true가 true를 반환합니다. (객체의 평등 방법과 다릅니다) system.out.println (c == d); // 객체의 값은 동일하지만 두 개의 다른 객체에 속하므로 System.out.println (c.equals (d)); // 진실
간단히 말하면, 문자열 상수를 비교할 때는 Equals가 반환 한 결과와 동일합니다. 문자열 객체의 값을 비교하려면 equals를 사용하십시오.
Equals를 사용하는 예를 참조하십시오.
패키지 챕터 05.equalstest; java.util.*; 공개 클래스 평등 한 {public static void main (String [] args) {Employee Alice1 = 새로운 직원 ( "Alice Adams", 75000, 1987, 12, 15); 직원 Alice2 = Alice1; // 동일한 객체 직원을 참조하십시오. Alice3 = 신입 사원 ( "Alice Adams", 75000, 1987, 12, 15); 직원 BOB = 신입 사원 ( "Bob Brandson", 50000, 1989, 10, 1); System.out.println ( "alice1 == alice2 :" + (alice1 == alice2)); System.out.println ( "alice1 == alice3 :" + (alice1 == alice3)); System.out.println ( "Alice1.equals (Alice3) :" + (Alice1.equals (Alice3)); System.out.println ( "Alice1.equals (bob) :" + (alice1.equals (bob)); System.out.println (bob.toString ()); }} Class Employee {공공 직원 (String N, Double S, Int Year, Int Month, Int Day) {Name = N; 급여 = s; GregorianCalendar Calendar = New GregorianCalendar (연도, 월, 일); Hireday = calendar.gettime (); } public String getName () {return name; } public double getSalary () {반환 급여; } 공개 날짜 getHireday () {return HiredAy; } public void RaisesAlary (Double Bypercent) {Double Raine = 급여 * Bypercent / 100; 급여 += 인상; } @override public boolean equals (Object OtherObject) {// 객체가 (this == OtherObject)를 식별하는지 확인하기위한 빠른 테스트; // 명시 적 매개 변수가 null 인 경우 (elestobject == null) false를 반환합니다. // 분류 된 분류가 일치하지 않으면 (getClass ()! = OtherObject.getClass ())가 false를 반환하면 동일 할 수 없습니다. // 이제 우리는 다른 Object가 널이 아닌 직원이라는 것을 알고 있습니다. // 필드가 확인 된 값을 식별했는지 여부를 테스트합니다. return name.equals (기타 .name) && Salary == Other.salary && HiredAy.equals (기타. Hireday); } @override public int hashcode () {return 7 * name.hashcode () + 11 * new double (Salary) .hashcode () + 13 * Hireday.hashCode (); } @override public String toString () {return getClass (). getName () + "[name =" + name + ", Salary =" + Salary + ", HiredAy =" + HiredAy + "]; } 개인 문자열 이름; 개인 이중 급여; 개인 날짜 고용; } Class Manager Extends Employee {public Manager (String N, Double S, Int Year, Int Month, Int Day) {Super (N, S, 연도, 월, 일); 바운스 = 0; } @override public double getSalary () {double basesalary = super.getSalary (); 반환 기본 + 바운스; } public void setBouns (double b) {bouns = b; } @override public boolean equals (Object OtherObject) {if (! super.equals (기타 개체)) return false; 관리자 기타 = (관리자) OtherObject; // Super는 이것과 다른 것이 동일한 클래스 리턴 바운스 == Other.bouns에 속한지 확인했습니다. } @override public int hashcode () {return super.hashcode () + 17 * 새로운 double (bouns) .hashcode (); } @override public String toString () {return super.toString () + "[bouns =" + bouns + "]; } 개인 더블 바운스; } "클래스가 equals () 메소드를 무시하는지 여부에 따라 두 가지 범주로 더 깊이 나누십시오.
(1) 클래스가 equals () 메소드를 무시하지 않으면 두 객체를 equals ()를 통해 비교할 때 실제로 두 객체가 동일한 객체인지 비교합니다. 현재이 두 객체를 "=="로 비교하는 것과 같습니다.
(2) 우리는 클래스의 equals () 메소드를 대체하여 equals ()가 다른 방식으로 두 객체가 동일인지 비교할 수 있도록 할 수 있습니다. 일반적인 관행은 다음과 같습니다. 두 객체의 내용이 동일하면 equals () 메소드는 true를 반환합니다. 그렇지 않으면 fasle을 반환합니다.
다음으로, 위의 두 가지 상황을 설명 할 예제를 알려 드리겠습니다.
1. "비정기 equals () 메소드"의 경우
코드는 다음과 같습니다 (EquameStest1.java) :
import java.util.*; import java.lang.comparable;/*** @desc equals () 테스트 프로그램. */public class EqualStest1 {public static void main (String [] args) {// 동일한 내용으로 2 개의 새로운 사람 객체를 만듭니다. Person P2 = 새로운 사람 ( "eee", 100); System.out.printf ( "%s/n", p1.equals (p2)); } /*** @desc 개인 클래스. */ 개인 정적 계급 사람 {int age; 문자열 이름; 공개 사람 (문자열 이름, int age) {this.name = 이름; this.age = age; } public String toString () {return name + " -" + age; }}} 실행 결과 :
다음과 같이 코드를 복사하십시오. false
결과 분석 P1.equals (P2)를 사용하여 "P1과 P2가 동일한지 여부를 비교하십시오". 실제로, equals () 객체의 방법을 호출합니다. "P1과 P2가 동일한 객체인지"비교하는 것입니다.
P1과 P2의 정의에서, 우리는 그들의 내용이 동일하지만 두 가지 다른 객체임을 알 수 있습니다! 따라서 반환 결과는 거짓입니다.
2. "덮어 쓰기 () 메소드"의 상황
위의 EqualStest1.java를 수정합니다.
코드는 다음과 같습니다 (EqualStest2.java) :
import java.util.*; import java.lang.comparable;/*** @desc equals () 테스트 프로그램. */public class EqualStest2 {public static void main (String [] args) {// 동일한 내용으로 2 개의 새로운 사람 객체를 만듭니다. Person P2 = 새로운 사람 ( "eee", 100); System.out.printf ( "%s/n", p1.equals (p2)); } /*** @desc 개인 클래스. */ 개인 정적 계급 사람 {int age; 문자열 이름; 공개 사람 (문자열 이름, int age) {this.name = 이름; this.age = age; } public String toString () {return name + " -" + age; } / *** @DESC Override EqualS 메소드* / @override public boolean equals (object obj) {if (obj == null) {return false; } // 객체가 같은 경우 true를 반환하고 그렇지 않으면 false를 반환합니다. } // 유형이 동일한 지 여부를 판단합니다. } person person = (사람) obj; return name.equals (person.name) && age == person.age; }}} 실행 결과 :
다음과 같이 코드를 복사하십시오. true
결과 분석 :
우리는 equalStest2.java에서 사람의 equals () 함수를 무시합니다. 두 사람의 이름과 나이가 같으면 true가 반환됩니다.
따라서 실행 결과는 true를 반환합니다.
말하자면, equals ()에 대한 Java의 요구 사항에 대해 이야기 해 봅시다. 다음과 같은 점이 있습니다.
대칭 : X.
반사율 : x.equals (x)는 "true"를 반환해야합니다.
유추 : X.equals (y)가 "true"를 반환하고 y.equals (z)가 "true"를 반환하면 z.equals (x)도 "true"를 반환해야합니다.
일관성 : x.equals (y)가 "true"를 반환하면 x와 y의 내용이 변경되지 않은 한 x.equals (y)를 몇 번 반복하더라도 반환은 "true"가됩니다.
비어 비어, X.equals (null)는 항상 "false"를 반환합니다. x.equals (다른 유형의 객체와 x)는 항상 "false"를 반환합니다.
이제 equals ()의 역할을 검토 해 봅시다. 우리가 equals ()를 다시 작성하면 함수를 변경하는 것이 불가능합니다!
equals ()과 ==의 차이점은 무엇입니까?
== : 그 기능은 두 객체의 주소가 동일한 지 여부를 결정하는 것입니다. 즉, 두 객체가 동일한 객체인지 확인하십시오.
Equals () : 함수는 두 객체가 동일한지 여부를 결정하는 것입니다. 그러나 일반적으로 두 가지 사용 조건이 있습니다 (이전 부분 1에서 자세히 설명) :
사례 1, 클래스는 equals () 메소드를 대체하지 않습니다. 그런 다음이 클래스의 두 객체를 equals ()를 통해 비교할 때이 두 객체를 "=="로 비교하는 것과 같습니다.
CASE 2, 클래스는 equals () 메소드를 대체합니다. 일반적으로, 우리는 두 객체의 내용을 동일하게하기 위해 equals () 메소드를 무시합니다. 내용이 동일하면 사실을 반환합니다 (즉, 두 객체는 동일하게 간주됩니다).
아래에서 차이점을 예제로 비교하십시오.
코드는 다음과 같습니다.
import java.util.*; import java.lang.comparable;/*** @desc equals () 테스트 프로그램. */public class EqualStest3 {public static void main (String [] args) {// 동일한 내용으로 2 개의 새로운 사람 객체를 만듭니다. Person P2 = 새로운 사람 ( "eee", 100); System.out.printf ( "p1.equals (p2) : %s/n", p1.equals (p2)); System.out.printf ( "P1 == P2 : %S/N", P1 == P2); } /*** @desc 개인 클래스. */ 개인 정적 계급 사람 {int age; 문자열 이름; 공개 사람 (문자열 이름, int age) {this.name = 이름; this.age = age; } public String toString () {return name + " -" + age; } / *** @DESC Override EqualS 메소드* / @override public boolean equals (object obj) {if (obj == null) {return false; } // 객체가 같은 경우 true를 반환하고 그렇지 않으면 false를 반환합니다. } // 유형이 동일한 지 여부를 판단합니다. } person person = (사람) obj; return name.equals (person.name) && age == person.age; }}} 실행 결과 :
p1.equals (p2) : truep1 == p2 : false
결과 분석 :
equalstest3.java :
(1) P1.Equals (P2)
이것은 P1과 P2의 내용이 동일한지 여부를 결정하기위한 것입니다. 사람이 equals () 메소드를 무시하고 이에 동등한 ()가 P1과 P2의 내용이 동일한지 여부를 결정하는 데 사용되기 때문에 P1 및 P2의 내용은 동일합니다. 그러므로 진정으로 돌아갑니다.
(2) P1 == P2
이것은 P1과 P2가 동일한 객체인지를 결정하기위한 것입니다. 그들은 각각 두 개의 새로운 사람이기 때문에; 따라서 거짓을 반환하십시오.