본문 바로가기
백엔드개발자/JAVA

@Data , hashCode()

by 보혀니 2022. 5. 16.

@Data는 @ToString, @EqualsAndHashCode, @Getter,Setter, @RequiredArgsConstructor를 모두 결합한 형태이다.

자주 사용되는 모든 메서드들을 생성할 수 있다는 장점이 있다.

 

@EqualsAndHashCode : equals(), hashCode() 메서드 생성

 

 

 

hashCode 가 뭔데... 써본 적 없어.

 hashCode라면 객체 주소값을 말하는건가 싶었는데 아닌 듯 하다.

Test t = new Test();
System.out.println(t); // com.hello.Test@4d157493
System.out.println(t.hashCode()); // 1293251731

// 혹싀.... 단순히... 4d157493 라는 값이 나오려나 싶었던거다..

 

 

hashCode()는 객체의 hashCode를 리턴한다. 해시 알고리즘에 의해 생성된 정수 값이다.

 

equals가 true라면 두 객체의 hashCode는 같은 값을 반환해야 한다.

그런데, equals가 false라고해서 두 객체의 hashCode는 다른 값을 반환할 필요는 없다.

 

왜?????????????????????????

 

hashCode 를 따라가 봤는데 이런식으로 되어있음

    public static int hashCode(byte[] value) {
        int h = 0;
        for (byte v : value) {
            h = 31 * h + (v & 0xff);
        }
        return h;
    }

문자열에서 한 글자씩 가져와서 어캐어캐해서 정수값으로 변경하고 있다는 것임

이런 구현 방식으로는 hashCode가 같아질 수 있단 거임.

그렇기 때문에 hashCode가 같더라도 equals가 false 일 수 있다는 것.

 

String a = "Z@S.ME"; // -1656719047
String b = "Z@RN.E"; // -1656719047

String c = new String("Hi");
String d = new String("Hi");

System.out.println(c.hashCode()); // hashCode가 같은 c와 d
System.out.println(d.hashCode()); // 왜냐면 문자열이 같으니까, equals는 true니까

 

 

 

 

 

'백엔드개발자 > JAVA' 카테고리의 다른 글

StringUtils  (0) 2022.09.25
getSession(), getSession(true), getSession(false)  (0) 2022.07.19
프로세스, 스레드  (0) 2022.05.10
Math 클래스  (0) 2022.05.05
Map  (0) 2022.04.25