이 Integer
클래스에는 Integer
-128에서 127 사이의 모든 값에 대해 하나씩 256 개의 특수 객체 를 저장하는 정적 캐시가 있습니다 .이를 염두에두고이 세 가지의 차이점을 고려하십시오.
new Integer(123);
이것은 (분명히) 아주 새로운 Integer
대상을 만듭니다.
Integer.parseInt("123");
이 int
구문 분석 후 프리미티브 값을 반환 합니다 String
.
Integer.valueOf("123");
이것은 다른 것보다 더 복잡합니다. 를 파싱하여 시작합니다 String
. 그런 다음 값이 -128과 127 사이이면 정적 캐시에서 해당 객체를 반환합니다. 값이이 범위를 벗어나면 값을 호출 new Integer()
하고 전달하여 새 객체를 얻습니다.
이제 질문의 세 가지 표현을 고려하십시오.
Integer.valueOf("127")==Integer.valueOf("127");
Integer
값이 127 인 정적 캐시에서 두 번 검색되어 자체 비교 되기 때문에 true를 리턴합니다 . Integer
관련된 객체는 하나뿐 이므로이를 반환합니다 true
.
Integer.valueOf("128")==Integer.valueOf("128");
false
128은 정적 캐시에 없으므로을 반환 합니다. 따라서 Integer
평등의 각 측면에 대해 새로운 것이 만들어집니다. 두 개의 다른 Integer
객체가 있고 양쪽이 정확히 동일한 객체 인 경우 ==
에만 객체를 반환 true
하므로이 값은 false
입니다.
Integer.parseInt("128")==Integer.valueOf("128");
int
왼쪽 의 프리미티브 값 128과 Integer
오른쪽 의 새로 생성 된 객체를 비교합니다. 그것이 비교하는 것은 의미가 없기 때문에 그러나 int
에를 Integer
, 자바는 자동 - 언 박싱 것 Integer
비교를하기 전에; 그래서 당신은과 비교 int
합니다 int
. 프리미티브 (128)는 그 자체와 같기 때문에을 리턴한다 true
.
.equals()
하고 그렇지 않으면 모든 베팅이 해제됩니다.