2014-06-09 3 views
1

질문을 해결하려고합니다. 하지만 프로그램 제어는 체크 한 두 숫자가 모두 같을 때도 if 문으로 넘어갑니다. 그 이유는 무엇입니까?Java-trouble이 같지 않음

static int lonelyinteger(int[] a) { 
Integer[] b=new Integer[a.length]; 
for(int i=0;i<a.length;i++){ 
    b[i]=new Integer(a[i]); 
} 
int val=0; 
Arrays.sort(b); 
boolean flag=false; 
for(int i=0;i<a.length-2;i+=2) 
    if (b[i]!=b[i+1]){ 
     val=b[i]; 
     flag=true; 
     break; 
    } 
if(flag==true) 
    return val; 
else 
    return b[a.length-1]; 
+0

'INT [] A'의 내용이 무엇이어야 하는가? – NoobEditor

+0

왜 'int'대신에'Integer'을 사용하고 있습니까? – Jesper

+0

@jesper sort 함수를 사용하고 싶었습니다. 객체와 함께 내림차순 정렬을 사용할 수 있기 때문에 내림차순 정렬을 요구하지 않는 경우에도 Integer를 사용하는 경향이 있습니다. – mahacoder

답변

7

Integer 개체에 !=을 사용하고 있습니다. 이것은 -128127 사이의 정수 값 (reference)이 JVM에 의해 캐시되기 때문에 작동합니다. 그러나 더 크거나 작은 값에 대해서는 작동하지 않습니다. 대신

if (!b[i].equals(b[i+1])){ 
    val=b[i]; 
    flag=true; 
    break; 
} 

.equals과 같이 올바르게 의견 예스퍼 지적 사용하여 JVM에 의해 Integer 객체에 사용되는 캐시는 새로운 정수의 명시 적 호출을 통해 객체를 생성하기 위해 JVM을 강제 할 때 을 사용하지 않습니다 new Integer(value)과 같은 생성자. 생성자를 호출하면 캐시 된 Integer 인스턴스를 반환하는 대신 새 Integer 인스턴스가 만들어집니다. 즉 두 객체가 동일한 인스턴스인지 여부를 확인하는 !===은 인스턴스가 서로 다르다고 항상 간주합니다.

+7

그리고' ! ='와'=='는 새로운'Integer' 객체를 new로 명시 적으로 생성하기 때문에'-128'과'127' 사이의 값으로'false'를 반환합니다. – Jesper

+0

@Jesper True. 나는 OP가'새로운 '것을 사용하고 있다는 것을 알지 못했다. 그에 따라 편집 됨. – cyon

2

1) 대신 new Integer()Integer.valueOf()을 사용하지 마십시오.

2) 객체 비교시 Object.equals()을 사용하십시오.

if (b[i]!=b[i+1]) { 
    ... 
} 

if (!b[i].equals(b[i+1])) { 
    ... 
} 
+0

새로운 Integer() 대신 Integer.valueOf()를 사용하는 이유는 무엇입니까? – mahacoder

+2

'new Integer()'는 항상 새로운 객체를 생성하는 반면,'Integer.valueOf()'는 미리 정의 된 상수를 사용할 수 있습니다. 이것은 'valueOf()'를 지원하는 모든 클래스에 적용 가능합니다. (예 : BigDecimal, Long, Boolean 등) –

+0

@ alikox-auto-boxing은 어떨까요? equals를 사용하여 비교하는 것이 귀하의 경우에 목적을 만족시키지 못했던 이유는 무엇입니까? ! –