2013-07-08 5 views
5

출력 변경 이유를 알 수 있습니까?오브젝트 값 변경시 증가 및 감소

public class Demo { 
    public void demo() 
    { 
     Integer y = 567; 
     Integer x = y; 
     System.out.println(x + " " + y); 
     System.out.println(y == x); 
     y++; 
     System.out.println(x + " " + y); 
     System.out.println(y == x); 
     y--; 
     System.out.println(x + " " + y); 
     System.out.println(y == x); 
    } 
    public static void main(String args[]) 
    { 
     Demo obj = new Demo(); 
     obj.demo(); 
    } 
} 

OUTPUT : 내가 마지막 거짓을 받고 있어요 왜 여기

567 567 

true 

567 568 

false 

567 567 

False 

.

+2

== 대신 y.equals (x)를 시도하십시오. – gcandal

답변

1
Integer y = 567; // y=567 
    Integer x = y; // x is equal to y object 
    System.out.println(x + " " + y); // out put x and y so obviously x and y are 567 
    System.out.println(y == x); // here x and y are in same reference. so this x==y is true and out put is true. 
    y++; // increment y by 1. then y=568 
    System.out.println(x + " " + y); // now x= 567 and y= 568 
    System.out.println(y == x);// now x not equals to y then false will print 
    y--; // again decrement y value 
    System.out.println(x + " " + y); // again x and y are same 567 
    System.out.println(y == x);// here y.value == x.value but x and y object wise not equal since object x and y are referring deference points 
+0

틀린,'=='** 항상 **는 객체 참조 검사를합니다. 두 번째'false'에 대한 설명이 잘못되었습니다. –

+0

@BuhakeSindi 나는 그것을 의미합니다. 그러나 당신은 틀린 그것을 얻는다. 이제 나는 어떤 단어를 바꾼다. –

0

x와 y는 서로 다른 두 개체를 참조하기 때문에.

y--; 

이 첫 번째 박싱을 Y

은 감소합니다 그것을보다 int로하고 상자에 비해 그 정수로합니다. 그리고이 새로운 박스형 정수는 다른 메모리 위치를 나타냅니다.

이상적으로, 래퍼 클래스에서 == 연산자보다는 래퍼 객체에 대해 equals 메서드를 호출하는 것이 좋습니다.

0

y == x은 콘텐츠 동일성 여부, 즉 그들이 가리키는 개체에 동일한 int이 포함되어 있는지 여부가 아닌 동일한 개체를 가리키는 지 여부를 확인합니다. 특히 x, y >= 128 일 때.

사용

y.equals(x); 

또는

(int) y == (int) x 

또는 대신 int 같은 xy를 선언

.

자동 해제 해제는 Integer == Integer 또는 Integer != Integer에서 발생하지 않습니다.

3

Integer y = 567; 
    Integer x = y; 

int y = 567; 
    int x = y; 

을 변경

와 suprprising 동작은 사라질 것입니다. 내 생각 엔 자바의 암시 적 자동 저장의 원시 값을 래퍼 객체로 비틀어서 직접 숫자를 조작하고 있다고 생각하는 것 같습니다.

0

Integer 대신 int 프리미티브를 사용하는 경우 최종 출력은 true입니다.

그러나 Integer 클래스를 사용하는 경우는 Object입니다. equals 메서드를 사용하면 최종 출력은 true이됩니다.

+0

'프리미티브 int 대신 Integer를 사용할 때. 최종 결과는 사실 일 것이다 .' 뭐? –

+0

@BuhakeSindi - Typo. – JHS

5

변경 불가능한 객체 인 Integer을 사용하고 있습니다.

기본적으로 코드는 따라서 이전 객체와 같은 (==)하지 않은 두 개의 새로운 Integer 객체를 만드는

y = new Integer(y.intValue() + 1); 

y = new Integer(y.intValue() - 1); 

입니다.

이 동작을 Java에서autoboxing이라고합니다. 컴파일러는 이러한 내부적 않기 때문에

+1

컴파일러는 생성자 대신에 Integer.valueOf()를 사용합니다. –

+0

@BuhakeSindi JVM이하는 일을 보여주지 않고 생성자를 사용하여 좀 더 명확하게 만들었습니다. –

2

이다 :

y-- 

의미 :

int _y = y.intValue(); 
_y--; 
y = Integer.valueOf(_y); 

따라서 yInteger 새로운 인스턴스를 갖는다. 값 평등 검사가 아니라 객체 참조 검사 (== 사용시)를 수행하고 있습니다.

equals() 방법을 사용하여 2 가지 값을 평가하십시오.

-1

하더라도, 당신은

Integer a = new Integer(1000); 
Integer b = new Integer(1000); 

== B를 작성하는 경우 -

하지만

Integer a = new Integer(1); 
Integer b = new Integer(1); 

== B에 대한 거짓을 -이 자바에서

사실이다 작은 정수의 캐시 : -127에서 128까지. 다른 모든 정수는 새로 생성 된 객체이며 같을 수 없습니다.

+0

Java에서 'new' 연산자 **는 항상 새로운 객체를위한 메모리를 할당합니다 **. 이는 내부 정적 캐시에서 응답에 지정된 범위의 정수를 사용하는 public static Integer valueOf (int i) 메서드와 반대입니다. 그렇지 않으면 새 정수를 반환합니다. – skuntsel