TL; DR
Java는 boxed Integer 인스턴스를 -128
에서 127
. 값 대신 ==
객체 참조 를 비교 하는 데 사용 하고 있으므로 캐시 된 객체 만 일치합니다. 박스되지 않은 기본 값으로 작업 하거나 객체 를 비교 하는 데 사용하십시오 .long
.equals()
Long
긴 (말장난 의도) 버전
Long 변수를 127보다 큰 값과 비교하는데 왜 문제가 있습니까? 위 변수의 데이터 유형이 원시 (long)이면 모든 값에 대해 코드가 작동합니다.
Java는 -128 ~ 127 범위의 Integer 개체 인스턴스를 캐시합니다 . 즉,
- N Long 변수 값
127
( cached )으로 설정하면 모든 참조가 동일한 객체 인스턴스를 가리 킵니다. (N 변수, 1 인스턴스)
- N Long 변수로 값을 설정하면
128
( 캐시되지 않음 ), 모든 참조가 가리키는 객체 인스턴스를 갖게됩니다. (N 변수, N 인스턴스)
그 이유는 다음과 같습니다.
Long val1 = 127L;
Long val2 = 127L;
System.out.println(val1 == val2);
Long val3 = 128L;
Long val4 = 128L;
System.out.println(val3 == val4);
다음을 출력합니다.
참
거짓
를 들어 127L의 메모리 (캐시)에 동일한 개체 인스턴스를 모두 참조 (VAL1과 val2만큼) 포인트 이후 값, 그것은 반환합니다 true
.
한편,에 대한 (128) 메모리에 캐쉬 그것을위한 인스턴스가 없기 때문에 값, 새로운 하나 (val3 및 val4 가리키는) 두 가지 경우에 생성 및 리턴 박스형 값에 대한 새로운 할당을 위해 만들어 false
온 그들 사이의 비교.
이는 기본 값이 아닌 두 개의 Long
객체 참조를 연산자 long
와 비교하기 때문에 발생합니다 ==
. 이 캐시 메커니즘이 아니라면 이러한 비교는 항상 실패하므로 여기서 실제 문제는 박스형 값을 ==
연산자 와 비교하는 것 입니다.
이러한 변수를 기본 long
유형으로 변경하면 이런 일이 발생하지 않지만 Long
객체를 사용하여 코드를 유지해야하는 경우 다음 접근 방식으로 이러한 비교를 안전하게 수행 할 수 있습니다.
System.out.println(val3.equals(val4)); // true
System.out.println(val3.longValue() == val4.longValue()); // true
System.out.println((long)val3 == (long)val4); // true
(캐스트에도 적절한 null 검사 필요)
IMO , 객체 비교를 처리 할 때 항상 .equals () 메서드 를 사용하는 것이 좋습니다 .
참조 링크 :
.longValue()
.