java object equals

cornpip
|2023. 8. 8. 00:37

Object.equals

    public static void main(String[] args) {
        Test t = new Test("hi");
        Test t2 = new Test("hi");
        t.equals(t2);
    }
    
    static class Test {
      String test;

      Test(String test) {
          this.test = test;
      }
    }

모든 객체의 조상은 Object고 Object는 equals method를 가지고 있다.

객체를 생성하고 equals에 별도의 @Override 가 없다면

    public boolean equals(Object obj) {
        return (this == obj);
    }

 위와 같이 동작한다. 참조 주소가 같아야 true를 반환하는 equals 이다.

    String t3 = "hi";
    String t4 = "hi";
    t3.equals(t4);
   
    Long t5 = 5L;
    Long t6 = 5L;
    t5.equals(t6);

String의 equals는 다음과 같다.

    public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        return (anObject instanceof String aString)
                && (!COMPACT_STRINGS || this.coder == aString.coder)
                && StringLatin1.equals(value, aString.value);
    }

Long의 equals는 다음과 같다.

    public boolean equals(Object obj) {
        if (obj instanceof Long) {
            return value == ((Long)obj).longValue();
        }
        return false;
    }

 

Wrapper class들은 우리가 원하는 참조 주소가 아닌 값을 비교하는 equals 메서드로 @Override 되어있다.

결론

참조 주소가 아닌 값을 비교하고자 한다면 Wrapper class의 equals는 맞다.