Java equals() 메소드 사용 설명 및 요약

6062 단어 Javaequals()
equals()   
클래스 초과 Object에는 이 equals() 방법이 있습니다. 이 방법은 주로 두 대상이 같은지 비교하는 데 사용됩니다.이 메서드의 소스 코드는 다음과 같습니다.

public boolean equals(Object obj) {
  return (this == obj);
  }
우리는 모든 대상이 표지(메모리 주소)와 상태(데이터)를 가지고 있음을 알고 있으며, 동시에 "=="두 대상의 메모리 주소를 비교한다. 그러므로 Object의 equals () 방법을 사용하는 것은 두 대상의 메모리 주소가 같은지, 예를 들어object1.equals(object2)는true로 equals1과 equals2가 사실상 같은 대상을 인용하는 것을 나타낸다.때때로 Object의 equals() 방법은 우리의 기본적인 요구를 만족시킬 수 있지만 우리는 우리가 두 대상을 비교하는 데 많은 시간을 들였다는 것을 알아야 한다. 이때 Object의 equals() 방법은 안 된다. 실제로 JDK에서 String, Math 등 봉인류는 모두 equals() 방법을 다시 썼다.다음은 String의 equals() 방법입니다.

public boolean equals(Object anObject) {
  if (this == anObject) {
    return true;
  }
  if (anObject instanceof String) {
    String anotherString = (String)anObject;
    int n = count;
    if (n == anotherString.count) {
    char v1[] = value;
    char v2[] = anotherString.value;
    int i = offset;
    int j = anotherString.offset;
    while (n-- != 0) {
      if (v1[i++] != v2[j++])
      return false;
    }
    return true;
    }
  }
  return false;
  }
이 코드 세그먼트에 대해:if(v1[i++]! = v2[j++])returnfalse;우리는 인용 비교가 아니라 내용 비교를 하는 String의 equals() 방법을 똑똑히 볼 수 있다.다른 포장류에 대해서는 모두 차이가 많지 않다.
Java 사양에서는 equals() 메서드를 사용하려면 다음과 같은 몇 가지 규칙을 따라야 합니다.
equals 메서드는 비어 있지 않은 객체 참조에서 동일한 관계를 수행합니다.
1. 자반성: 비공식 인용 값 x에 대해 x.equals (x) 는true로 되돌아와야 합니다.
2, 대칭성: 모든 비공식 인용 값 x와 y에 대해, y.equals(x)가true로 돌아갈 때만 x.equals(y)가true로 돌아가야 합니다.
3. 전달성: 비공식 인용 값 x, y, z에 대해 x.equals (y) 가true 를 반환하고 y.equals (z) 가true 를 반환하면 x.equals (z) 가true 를 반환해야 합니다.
4, 일치성: 비공식 인용 값 x와 y에 대해 x.equals (y) 를 여러 번 호출하여true 또는 false 를 되돌려줍니다. 전제는 대상의 equals 비교에 사용된 정보가 수정되지 않았기 때문입니다.
5. 비어 있지 않은 인용 값 x에 대해 x.equals (null) 는false 로 되돌아와야 합니다. 
상기 몇 가지 규칙에 대해 우리는 사용하는 과정에서 준수하는 것이 가장 좋다. 그렇지 않으면 예상치 못한 오류가 발생할 수 있다.
자바에서 비교를 하려면 비교의 유형에 따라 적당한 비교 방식을 선택해야 한다.
1) 대상 도메인, equals 방법을 사용합니다. 
2) 유형의 안전한 매거진, equals 또는 == 사용.
3) null의 대상 영역일 수 있습니다: ==와 equals를 사용합니다.
4) 배열 영역: Arrays를 사용합니다.equals .
5) 플로트와 더블을 제외한 원시 데이터 형식: 사용==.
6)float 유형: Float를 사용합니다.foatToIntBits를 int 유형으로 변환하고 == 를 사용합니다. 
7) double 유형: Double을 사용합니다.doubleToLongBit를 long 유형으로 변환한 다음 ==를 사용합니다.
6), 7)왜 변환이 필요한지 우리는 그들이 상응하는 포장류의 equals() 방법을 참고할 수 있다. 다음은 Float류의 것이다.

public boolean equals(Object obj) {
  return (obj instanceof Float)
      && (floatToIntBits(((Float)obj).value) == floatToIntBits(value));
  }
이유야, 안에 두 가지가 언급됐어.

However, there are two exceptions:
If f1 and f2 both represent
Float.NaN, then the equals method returns
true, even though Float.NaN==Float.NaN
has the value false.
If <code>f1 represents +0.0f while
f2 represents -0.0f, or vice
versa, the equal test has the value
false, even though 0.0f==-0.0f
has the value true.
equals()에서 getClass로 유형 판단
우리가 equals () 방법을 덮어쓸 때, 일반적으로 getClass를 사용하여 유형 판단을 하는 것을 추천하며, instanceof를 사용하지 않습니다.우리는 instanceof의 작용이 왼쪽 대상이 오른쪽 클래스인지 아닌지를 판단하는 실례를 잘 알고 있으며, boolean 형식의 데이터를 되돌려줍니다.계승 중인 자류의 실례가 부류의 실현 여부를 판단할 수 있다.뒤에 있는 이 말을 주의해라. 계승 중인 자류의 실례가 부류의 실현인지 아닌지를 판단할 수 있는 것이 바로 이 말이 이상하게 하는 것이다.우리는 먼저 아래의 실례를 본다 (에서 발췌한 것).
상위 클래스: Person

public class Person {
  protected String name;

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }
  
  public Person(String name){
    this.name = name;
  }
  
  public boolean equals(Object object){
    if(object instanceof Person){
      Person p = (Person) object;
      if(p.getName() == null || name == null){
        return false;
      }
      else{
        return name.equalsIgnoreCase(p.getName());
      }
    }
    return false;
  }
}

하위 클래스: Employee

public class Employee extends Person{
  private int id;
  
  public int getId() {
    return id;
  }

  public void setId(int id) {
    this.id = id;
  }

  public Employee(String name,int id){
    super(name);
    this.id = id;
  }
  
  /**
   *  equals() 
   */
  public boolean equals(Object object){
    if(object instanceof Employee){
      Employee e = (Employee) object;
      return super.equals(object) && e.getId() == id;
    }
    return false;
  }
}

위의 상위 클래스 Person과 하위 클래스 Employee는 모두 equals () 를 다시 썼지만, Employee는 상위 클래스보다 id 속성이 하나 더 많습니다.테스트 프로그램은 다음과 같습니다.

public class Test {
  public static void main(String[] args) {
    Employee e1 = new Employee("chenssy", 23);
    Employee e2 = new Employee("chenssy", 24);
    Person p1 = new Person("chenssy");
    
    System.out.println(p1.equals(e1));
    System.out.println(p1.equals(e2));
    System.out.println(e1.equals(e2));
  }
}
위에서 두 명의 직원과 한 명의 일반인을 정의했다. 비록 그들은 동명이지만 틀림없이 같은 사람이 아니기 때문에 이치대로 말하면 출력 결과는 모두false여야 하지만 뜻대로 되지 않는다. 결과는true,true,false이다.
그 e1에게!e2 우리는 매우 이해하기 쉽다. 왜냐하면 그들은 비교name뿐만 아니라 id도 필요로 하기 때문이다.그러나 p1은 e1과 같고 e2와 같다. 이것은 매우 이상한 것이다. 왜냐하면 e1, e2는 분명히 두 가지 다른 종류이기 때문이다. 그러나 왜 이런 상황이 발생했는가?우선equals(e1)는 p1을 호출하는 equals 방법이다. 이 방법은 instanceof 키워드를 사용하여 e1이 Person 클래스인지 검사한다. 여기서 instanceof: 왼쪽 대상이 오른쪽 클래스인지 아닌지를 판단하는 실례도 있고 계승 중인 하위 클래스의 실례가 아버지 클래스인지 아닌지를 판단할 수 있다.그들 둘은 계승 관계가 존재하기 때문에 틀림없이true로 돌아갈 것이고, 양자name는 또 같기 때문에 결과는 틀림없이true이다.
그래서 위의 상황은 키워드 instanceof를 사용했는데 이것은 매우 쉽다.그러므로 equals를 덮어쓸 때 getClass를 사용하여 유형 판단을 하는 것을 추천합니다.instanceof를 사용하는 것이 아니라
읽어주셔서 감사합니다. 여러분에게 도움이 되었으면 좋겠습니다. 본 사이트에 대한 지지에 감사드립니다!

좋은 웹페이지 즐겨찾기