2010-01-07 3 views
15

그래서 오늘이 질문을 받았습니다.박스형 프리미티브 및 동등 물

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

이 프로그램은 무엇을 출력합니까? 그것은 사실을 반환합니다. 나는 그것이 자동 (및 자동 유엔) 권투를 이해했기 때문에 그것이 항상 틀린 인쇄 할 것이라는 점을 응답했다. 정수 = 3을 지정하면 ==가 원시 값이 아닌 참조를 평가할 수 있도록 새 정수 (3)가 작성된다는 인상하에있었습니다.

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

+0

@CiroSantilli 六 四 事件 法輪功 包 卓 four 어떻게하면 광산이 4 년 전에 요청 받았을 때 그 광산과 중복 될 수 있습니까? 최소한 중복 게시물이있는 이벤트의 순서를 고려해 봅시다. –

+0

http://meta.stackexchange.com/questions/147643/should-i-vote-to-close-a-duplicate-question-even-though-its-much-newer-and-ha –

+0

하지만 가능한 http의 중복 : //stackoverflow.com/questions/1700081/why-does-128-128-return-false-but-127-127-return-true-when-converting-to-integ가 더 적절하다면 앞의 것은 잘못되었습니다. 하지만 어쩌면 둘 다 틀리다 ;-) –

답변

20

-128에서 127 사이의 상자에 넣은 값이 캐시됩니다. 복싱은 캐시를 사용하는 Integer.valueOf 메서드를 사용합니다. 범위를 벗어나는 값은 캐시되지 않으며 항상 새 인스턴스로 생성됩니다. 값이 캐시 된 범위에 속하므로 값은 == 연산자를 사용하여 동일합니다. Java 언어 규격에서

인용구 :

값 (P)가 박스형되는 경우, 진정한 거짓 바이트, \ u0000의 u007f \하는 범위 의 문자 또는 지능이나 짧다 숫자를 -128에서 127 사이로 변경 한 다음 r1과 r2는 두 개의 복식 전환 두 결과입니다. r1 == r2 인 경우 항상 입니다.

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

+0

+1 : 너희들은 너무 많이 알고있어 :)이 캐싱에 대해 더 많은 것을 배울 수있는 문서에 대한 링크를 제공해 주시겠습니까? – gameover

+1

JDK의 소스를 봅니다. src.zip/java/lang/Integer로 이동하십시오.java를 찾아 "cache = new Integer [256];"를 찾으십시오. 그것이 초기화입니다. 다음으로 "public static Integer valueOf (int i)"를 찾으십시오. 캐시를 사용하여 캐시 된 인스턴스 중 하나가 요청 될 때마다 캐시 된 인스턴스를 반환하는 방법 중 하나입니다. – helios

+0

java.lang.Character에는 유니 코드 0과 127 (ASCII-7/us-ascii) 사이의 chars에 대한 caché도 있습니다. – helios

11

이 정말 무슨 일이 일어나고있는 것입니다 :

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

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

자바는 -128 ~ 127 사이의 Integer 개체의 캐시를 다음과 같이 비교 유지

어느 것이 false을 인쇄해야합니다.

5

(자동 박스형 정수 중 일부가 캐시되기 때문에 실제로 동일한 참조를 비교할 수 있습니다. this post에는 더 자세한 예제와 설명이 있습니다.

4

캐싱이 너무 오토 박싱 이외의 발생이 고려 :

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 

을 그래서 일반적으로 당신이 떨어져 비교 객체 '=='에서 유지하려는 생각

+0

당신 말이 맞아요. 이것은'valueOf' 메쏘드에서 캐싱 된 결과입니다. –

+0

예, 그렇지만 재미있게 Integer.valueOf (String s)에는 없습니다. 이 얼마나 엉망 이죠. –