2017-10-14 6 views
-2

두 개의 다른 객체 s와 p에 대해 String의 변수에 대한 연산은 new를 사용하여 생성 한 결과를 false (1 행)로 표시하지만 3 행과 4 행 (주석 된 행 번호)이 True를 출력으로 표시하는 이유는 무엇입니까?두 개의 다른 객체에 대한 Test 클래스의 변수가 == 연산에 대해 true를 제공하고 String 객체에 대해 동일한 연산 결과가 false로 나타나는 이유는 무엇입니까?

저는 사실을 알고 있습니다 ==는 참조 비교를위한 것이고 그것이 참조 비교를위한 것이라면 의심스러운 부분입니다. 그렇다면 4 번째 줄이 참이고 j가 정수이고 왜 불변 개념이 없는지 이유는 무엇입니까? String (String s) 그리고 매번 새로운 객체를 생성해야합니까?

class World 
{ 
    public static void main(String[] args) 
    { 
     String s=new String("B"); 
     String p=new String("B"); 
     System.out.println(s==p);     //false line 1 
     Test t1= new Test("A",4); 
     Test t2= new Test("A",4); 
     System.out.println(t1==t2);     //false  line 2 
     System.out.println(t1.s==t2.s);    //true  line 3 
     System.out.println(t1.j==t2.j);    //true  line 4 
    } 
} 

class Test 
{ 
    String s; 
    int j; 
    Test(String s, int j) 
    { 
    this.s=s; 
    this.j=j; 
    } 
} 
+4

"t1과 t2가 서로 다른 객체이므로 3 행과 4 행이 서로 다른 이유는 무엇입니까?"- t1과 t2는 서로 다른 객체이지만 3 행에서 비교하지 않습니다. 서로 다른 객체가 아닌 문자열입니다. 같은 문자열 리터럴 인''A ''에 대한 두 개의 참조가 있습니다. 이것은 새로운'String' 객체를 명시 적으로 생성 한's'와'p'를 사용했을 때와 매우 다릅니다. – azurefrog

답변

1

문자열에 생성자를 변경 시도, 그래서 같은 값을 갖는 두 개의 문자열은 동일한 참조가있을 수 있습니다. (Integers의 경우도 마찬가지입니다. 특정 범위의 객체는 동일한 값을 가진 경우 동일한 객체로 참조됩니다.) 이것은 생성자의 t1과 t2에 대해 s의 값과 동일한 객체 "A"를 갖는 결과를 가져올 수 있습니다. 2 개의 int primitive는, 같은 값을 가지는 경우는 항상 같습니다.

+0

이 문장을 설명해 주시겠습니까? "정수와 동일합니다. 특정 범위의 객체가 동일한 객체로 참조 된 경우 동일한 값을가집니다." 내 지식에 따르면이 문제는 자동 저장의 경우에만 발생합니다. –

+0

두 개의 작은 정수가 있습니다. Integer i1 = Integer.valueOf (127); 정수 i2 = Integer.valueOf (127); comparsion은 i1 == i2가 될 것이다. 대신 캐싱 영역 외부에서 정수가 두 개인 경우, 즉 Integer i1 = Integer.valueOf (1270); 정수 i2 = Integer.valueOf (1270); comparsion은 i1! = i2가 될 것입니다. 간단한 단위 테스트로 쉽게 확인할 수 있습니다. 또는 https://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html#valueOf(int) – juwil

+0

의 스펙을 참조하십시오. 내부적으로 valueOf()를 사용하는 Autoboxing의 경우에도 마찬가지입니다. 방법으로 당신이 언급 한 위의 예제에서 두 가지 중 일어나는 일이 아니다. –

1

== 연산자를 두 개의 정수로 사용하면 Java 값에서 값을 비교합니다. 한편 두 문자열에 ==을 사용하거나 두 클래스는 값이 아닌 메모리에서의 위치를 ​​비교합니다. Test 클래스에서주의해야합니다. 클래스 필드에 인수와 같은 이름을 지정하고 있기 때문에 실제로 j와 s의 값을 자신이 생각하는 것으로 할당하지 않을 수도 있습니다. 일반적으로 자바에 캐시

Test(String str, int i){ 
    s = str; 
    j = i; 
} 
+0

그는 이것을 할당에 사용하기 때문에 이름을 변경할 필요가 없습니다. 그리고 그것은 그 문제와 관련이 없습니다. – juwil