2014-12-29 3 views
0
public class Test2 { 

    public static void main(String[] args) { 

    String s1="Come back"; 
    String s2="Come back"; 
    String s3=s1; 

    if(s1==s2) 
     System.out.println("Equal"); 
    else 
     System.out.println("Not Equal"); 

    if(s1==s3) 
     System.out.println("Equal"); 
    else 
     System.out.println("Not Equal"); 

}} 

출력 : equal equal, 예상 not equal equal입니다. 내 강사는 "=="문은 변수의 참조를 비교합니다. s1과 s2의 참조는 서로 다릅니다. 아무도 이것을 설명 할 수 있습니까?"=="문 사용

+2

"Java 문자열 리터럴 풀 인턴"키워드를 사용하여 Google 또는 Stackoverflow 검색을 사용하십시오. –

+0

Thanks @ AdrianShum. 그/그녀가 그것을 할 때, 그/그녀를 바로이 페이지로 데려 올 것입니다. –

답변

1
String s1 = new String(“come back”); 

// 힙의 새 개체를 만듭니다. 동적 할당, 그것은 프로그래머

String s2 = “come back”; 

// 동일한 값이 일치하는 문자열 오브젝트가 문자열 상수 풀에없는 경우에만 새로운 캐릭터 오브젝트가 작성되는 주어진다. 정적 할당은, 메모리는 JVM에 의해 할당 된

String s3 = "come back"; 

// 리터럴 문자열을 새 문자열을 선언 할 때

자바에서
s1 == s2 // false 
s2 == s3 // true 
3

문자열 리터럴은 interned이므로 동일한 내용의 리터럴은 실제로 동일한 기본 참조를 사용합니다. intern()를 사용하여 당신은 인턴 문자열을 할 수

:

String s1 = new String("a"); 
String s2 = new String("a"); 

// false 
System.out.println("References equal? " + (s1 == s2)); 

s1 = s1.intern(); 
s2 = s2.intern(); 

// true 
System.out.println("References equal after interning? " + (s1 == s2)); 
0

, 그것은에 추가되는 문자열 상수 풀에서 "돌아올"을 사용하여 같은 값을 가지는 캐릭터 라인이 풀에 벌써 존재하지 않는 경우는 String 풀 문자열 풀을 사용하면 JVM이 메모리를 절약하기 위해 이미 풀에 추가 된 문자열 상수를 다시 사용할 수 있습니다. 그래서 S2와 S1을 같은 값으로 정의하면 JVM이 이미 풀에있는 S1을 다시 사용하므로 S1 == S2가 true를 반환합니다.

+0

'새 문자열을 선언 할 때 String 풀에 추가됩니다. '이것은 새로운 문자열 ("blub")'이 "blub"을 풀에 추가하는 것처럼 들리지만, 그렇지 않습니다. – Tom

+0

사실입니다. 모호합니다. "새로운 String을 선언함으로써"나는 당신이 할 때 의미했다 : String x = "blub". 해명 해줘서 고마워. – Denorm

+0

'String test = "test"와 같은 String 리터럴을 선언 할 때 *와 같은 것을 쓸 수도 있습니다. * – Tom

0

String.equals(String other) 함수를 사용하면 연산자를 ==이 아닌 문자열을 비교할 수 있습니다.

이 함수는 문자열의 실제 내용을 검사하고 == 연산자는 객체에 대한 참조가 같은지 여부를 확인합니다. 문자열 상수는 일반적으로 동일한 값을 가진 두 개의 상수가 실제로 ==과 비교 될 수 있도록 "인턴 된"것이지만, 그것에 의존하지 않는 것이 좋습니다.