2014-04-08 10 views
1

jls에 설명 된 변환이 우선 순위에 따라 정렬된다고 가정합니다. 우선 greate 우선 순위가 있습니다. primitive == 래퍼는 원시 == 원시 또는 래퍼 == 래퍼로 변환합니까?

jls

따라서 I는 BoxingUnboxing보다 큰 우선 순위를 갖는 것으로 해결. 나는이 가정을 점검하기로 결정했다.

연구 다음 코드를

public class BoxingUnboxingPriority { 
    public static void main(String [] args){ 
     int sn = 1000; 
     Integer isn1= new Integer(sn); 
     System.out.println(sn == isn1); 

    } 
} 

아웃 :

true 

복싱은 무엇입니까?

false

는 따라서 내가 실수를했다 : 단지 new Integer(primitiveInt)

내가 코드를 밖으로

int sn = 1000; 
Integer isn1= new Integer(sn); 
Integer isn2= new Integer(sn); 
System.out.println(isn1 == isn2); 

약간 변경됩니다.

이 문제를 알려주십시오.

+1

'=='대신'.equals'를 사용하여 객체를 비교하십시오. '=='는 ** 같은 객체 **인지를 검사합니다. ** 같은 객체 **는 둘 다 생성하기 위해'new'를 사용했던 것과 다릅니다. '.equals'는 같은 숫자를 나타 내기 때문에'true'를 반환합니다. – JonK

+1

@Andremoniy там вообще не про джаву даже! – gstackoverflow

+0

@JonK 테스트에서 질문입니다 – gstackoverflow

답변

0

jls에 설명 된 변환이 우선 순위에 따라 정렬된다고 가정합니다.

올바르지 않습니다. JLS는 전환에 대한 "우선 순위"에 대해서는 말하지 않습니다. 그것은 인정 된 개념이 아닙니다.

실제로 적용 할 수있는 변환은 각 연산자에 대해 사례별로 문서화됩니다. 따라서 JLS 15.21.1은 숫자 유형의 경우 == 또는 !=은 두 피연산자의 "2 진 숫자 승격"결과를 나타냅니다. JLS 5.6.2은 이진 숫자 프로모션이 "unboxing conversion"(5.1.8)과 "기본 프리미엄 변환"(5.1.2)과 마지막으로 "값 세트 변환"(5.1.3)으로 구성되어 있다고 말합니다.

대조적으로 JLS 15.21.3== 또는 !=을 사용하여 두 개의 참조를 비교할 때 프로모션이나 전환이 발생하지 않는다고 말합니다.

는 (사실, 일반적인 자바 초보자의 실수는 두 Integer 객체가 아닌 equals(Object) 방법을 비교하는 ==을 사용하는 것입니다. 그리고 아마 당신이 찾고있다 "는 질문에"에 대한 이해를 테스트하려고하는 것입니다 .. primitiv을 비교하십시오.)

1

기본 객체를 Wrapper 객체와 함께 사용하면 해당 래퍼 객체의 상자가 풀리고 작업이 적용됩니다.

첫 번째 경우 snisn1으로 비교하면 isn1이 언 박싱되고 값이 비교됩니다. 따라서 true이 있습니다. 두 번째 경우

, isn1, isn2 두 가지 목적이므로 == 연산자 false

+0

이렇게 ** jls에 설명 된 변환은 우선 순위에 따라 정렬됩니다 **이 절은 잘못 되었습니까? – gstackoverflow

+0

아니, 두 번째 사건은 단순히 권투/unboxing과 아무 상관이 없다, 그것은 단지 두 개의 개체에 대한 참조 평등이다 –

+0

@OlegEstekhin : 나는 권투/unboxing와 무언가가있다. –

2

relevant section 줄 것이다

15.21.1. 동등 연산자의 피연산자가 숫자 타입 모두 또는 하나는 숫자 형이고 다른 하나는 가변이면 수치 평등 연산자 ==와! =

은 (§5.1.8) 숫자 타입, 이진 숫자 프로모션이 수행된다 피연산자 (§5.6.2).

그래서 : - 그들은 모두 object references을 둘 유형의 정수없는 둘 원시적 숫자 유형

boolean b = o.intValue() == i; 

:

Integer o = 1; 
int i = 1; 
boolean b = o == i; 

...에 해당합니다.

+0

숫자 유형이란 무엇입니까? – gstackoverflow

+0

[숫자 유형은 정수 유형 및 부동 소수점 유형입니다.] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.2) – McDowell

0

int sn=1000; Integer isn1=new Integer(sn); System.out.println(sn == isn1);

System.out.println(sn == isn1.intValue());

로 변환됩니다 래퍼가있는 래퍼 객체가 먼저 언 박싱되고 비교됩니다. 래퍼 객체 intValue()는 원시 비교 결과 true로 인해 int를 반환합니다. 그래서 거짓 두 개의 서로 다른 개체를 비교

Integer isn1= new Integer(sn); 

Integer isn2= new Integer(sn); System.out.println(isn1 == isn2);

//.