문제

그래서 오늘이 질문을 받았습니다.

Integer a = 3;
Integer b = 2;
Integer c = 5;
Integer d = a + b;
System.out.println(c == d);

이 프로그램은 무엇을 인쇄합니까? 진실이 반환됩니다. 나는 자동 (및 자동 유엔) 권투를 이해하는 방식 때문에 항상 거짓으로 인쇄 할 것이라고 대답했다. 나는 정수 a = 3을 할당하면 새로운 정수 (3)를 만들어 a ==가 기준 값보다는 참조를 평가할 수 있다는 인상을 받았습니다.

누구든지 이것을 설명 할 수 있습니까?

도움이 되었습니까?

해결책

-128에서 127 사이의 박스형 값이 캐시됩니다. 권투 사용 Integer.valueOf 캐시를 사용하는 방법. 범위 외부의 값은 캐시되지 않으며 항상 새 인스턴스로 생성됩니다. 값이 캐시 된 범위로 떨어지므로 == 연산자를 사용하여 값이 동일합니다.

Java 언어 사양의 인용 :

박스형 값이 true, false, byte, 범위 u0000 ~ u007f의 숯이 있거나 -128과 127 사이의 int 또는 짧은 숫자는 R1과 R2를 p의 두 권투 변환의 결과로 두십시오. R1 == R2는 항상 그렇습니다.

http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1.7

다른 팁

이것이 실제로 일어나는 일입니다.

Integer c = Integer.valueOf(5);
Integer d = Integer.valueOf(a.intValue() + b.intValue());

Java는 캐시를 유지합니다 Integer -128에서 127 사이의 물체. 다음과 비교하십시오.

Integer a = 300;
Integer b = 200;
Integer c = 500;
Integer d = a + b;
System.out.println(c == d);

인쇄해야합니다 false.

(자동 박스) 정수 중 일부가 캐시되었으므로 실제로 동일한 참조를 비교하고 있기 때문입니다. 이 게시물 더 자세한 예와 설명이 있습니다.

캐싱은 오토 옥싱 외부에서 발생합니다. 이것을 고려하십시오.

Integer a = 1;
Integer b = new Integer(1);
Integer c = Integer.valueOf(1);

System.out.println(a == b);
System.out.println(b == c);
System.out.println(c == a);

이것은 인쇄 할 것입니다 :

false
false
true

그래서 나는 일반적으로 객체를 비교할 때 '=='에서 멀리하고 싶다고 생각합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top