Java의 Equals 사용 방법 요약
Q1. 언제 대상의 equals 방법을 다시 써야 합니까?
답: 일반적으로 우리가 값 비교를 해야 할 때 대상을 다시 쓰는 equals 방법이 필요합니다.예외적인 상황은'effective 자바'의 제7조'equals를 개작할 때 통용적인 약속을 지키세요'에서 명확하게 묘사되었다.
우리는 Java에서 모든 객체가 Object에 상속된다는 것을 알고 있습니다.다시 쓰지 않으면 기본 equals 코드는 다음과 같습니다.
public boolean euqals(Object obj){
 return this == obj;
}
Q2. equals를 어떻게 다시 씁니까?
답: 우선, equals 방법을 바꿀 때, 그것의 통용 약속을 만족시킬 것을 보증해야 한다.이러한 규칙은 다음과 같습니다.
자반성, 임의의 인용값 x, x.equals(x)는 반드시true입니다.
대칭성, 임의의 인용값 x와 y에 대해, y.equals(x)만 있을 때, x.equals(y)도 반드시true로 되돌아옵니다.
전달성, 임의의 인용값 x, y,z.x.equals (y) 가true, y.euqals (z) 가true로 되돌아오면 x.equals (z) 가true로 되돌아옵니다.
일치성, 임의의 인용값 x와 y에 대해 equals 비교에 사용되는 대상 정보가 수정되지 않으면, x.equals (y) 를 여러 번 호출하거나true 를 일치시키거나false 를 일치시키십시오.
비공성, 모든 대상은null과 같지 않아야 합니다.
사실 제가 생각하는 간단한 방법은 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 (nC != 0) {
  if (v1[i++] != v2[j++])
   return false;
  }
  return true;
 }
 }
 return false;
}
Q3. equals를 수정할 때 무엇을 주의해야 합니까?
답: 대체로 다음과 같은 몇 가지를 주의해야 합니다.
equals 방법을 수정하면hashCode 방법도 수정하십시오
우선 이것은 언어의 하나약속입니다. 이렇게 하는 이유는 이 대상이 해시 용기의 원소일 때hashCode에 의존해야 하기 때문입니다. 대상의 기본적인hashCode는 이 대상 특유의hashCode를 되돌려줍니다. 서로 다른 대상의hashCode는 되돌려주는 값이 다르고 해시 용기가 원소를 처리할 때 대상의 해시 값에 따라 대상을 다른 통에 분배합니다. 만약에 우리가 대상의hashCode를 다시 쓰지 않는다면그러면 값이 같은 대상의 해시 값도 달라져서 해시 용기에서 찾을 때 대응하는 요소를 찾을 수 없습니다.
더 자세한 정보는'effective Java'의 8조'equals를 바꿀 때는hashCode를 항상 고쳐야 한다'를 보십시오.
다시 쓸 때 함수 성명의 정확성을 보증합니다
equals의 성명은
public boolean equals(Object obj)
class Point{
final int x;
final int y;
public void Point(int x, int y)
 this.x = x;
 this.y = y;
}
public boolean euqals(Point obj){
  return (this.x == obj.x && this.y == obj.y);
 }
}
Point a(1, 2);
Poinr b(1, 2);
System.out.println(a.equals(b));//  true
import java.util.HashSet;
HashSet<Point> coll = new HashSet<Point>();
coll.add(a);
System.out.println(coll.contains(b));//  false
계승 관계가 있을 때 equals의 정확성에 주의하세요
하나의 클래스가 equals 방법을 다시 쓴 후에 다른 클래스가 이런 종류를 계승하면 앞에서 말한 대칭성을 위반할 수 있습니다. 코드는 다음과 같습니다.
public class ColoredPoint extends Point { 
 private final Color color;
 public ColoredPoint(int x, int y, Color color) {
 super(x, y);
 this.color = color;
 }
 @Override 
 public boolean equals(Object other) {
 boolean result = false;
 if (other instanceof ColoredPoint) {
  ColoredPoint that = (ColoredPoint) other;
  result = (this.color.equals(that.color) && super.equals(that));
 }
 return result;
 }
}
Point p = new Point(1, 2);
ColoredPoint cp = new ColoredPoint(1, 2, Color.RED);
System.out.println(p.equals(cp)); // ture
System.out.println(cp.equals(p)); // false
Color 정보를 무시하고 비교하는 경우 ColoredPoint의 equals 방법을 다음과 같이 변경합니다.
@overwrite
public boolean equals(Object obj){
 if((obj instanceof Point)){
 return false;
 }
 if(!(obj instanceof ColoredPoint)){
 return obj.equals(this);
 }
 return super.equals(obj) && ((ColoredPoint)obj).color == color;
}
ColoredPoint cp1 = new ColoredPoint(1, 2, Color.RED);
Point p = new Point(1, 2);
ColoredPoint cp2 = new ColoredPoint(1, 2, Color.BLUE);
System.out.println(cp1.equals(p)); //true
System.out.println(p.equals(cp2)); //true
System.out.println(cp1.equals(cp2)); //false
class ColoredPoint{
 private final Point point;
 private final Color color;
 public Point asPoint(){
 return point;
 }
 public boolean equals(Object obj){
 boolean ret = false;
 if(obj instanceof ColoredPoint){
  ColoredPoint that = (ColoredPoint)obj;
  ret = that.point.equals(point) && color.equals(that.color);
 }
 return ret;
 }
}
이상은 전문의 내용입니다. 수준이 제한되어 있기 때문에 문장에 오류가 있을 수 있습니다. 지적해 주십시오. 감사합니다.
본문이 여러분의 학습에 도움이 되기를 바랍니다. 또한 여러분이 우리를 많이 지지해 주시기를 바랍니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.