[DEV] 기록

[Java] Long, Integer 값 비교는 ==이 아닌 equals로 해야하는 이유

꾸준함. 2023. 6. 23. 13:28

개요

리스트를 Long 타입 id 기준으로 필터링하는데 id 값이 둘 다 203으로 동일한데도 불구하고 빈 리스트가 돌아오는 버그가 발생했습니다.

반면 id 값이 127 이하일 때는 id 값이 같으면 해당 id가 포함된 리스트가 반환되었습니다.

 

원인

기본적으로 ==은 메모리 주소값을 비교하기 때문에 값이 같더라도 메모리 위치가 다르면 false를 반환합니다.

id 값이 127 이하일 때는 equals가 아닌 ==으로 비교해도 정상적으로 동작한 것은 Java에서는 -128부터 127까지의 범위 내에 있는 Integer와 Long 객체를 캐싱하여 동일한 객체로 취급하기 때문입니다.

위와 같이 동작하는 이유는 JVM에서 성능 향상을 위해 수행되는 옵티마이제이션을 진행하기 때문입니다.

 

해결 방법

제목에서도 명시했듯이 Wrapper Type 값을 비교할 때는 equals 메서드를 사용하고 long, integer와 같은 Primitive Type 값을 비교할 때는 ==으로 비교하면 됩니다.

 

반응형