2016-07-20 3 views
7

Java 버전 1.6에서는 출력이 false true이지만 버전 1.8에서는 출력이 true true으로 변경되었습니다.인턴 메소드 개념 혼동이 다른 버전으로 변경됨

왜 이런 일이 발생했는지 설명 할 수 있습니까?

인턴 메서드는 힙에서 생성 된 개체의 해당 문자열 상수 풀을 참조하는 데 사용되며 개체가 없으면 문자열 상수 풀을 만듭니다. 제 이해가 잘못되면 저를 시정하십시오.

public class Intern_String2 { 

public static void main(String[] args) { 
    // TODO Auto-generated method stub 

    String s1 = new String("durga"); //object created in heap 

    String s2 = s1.concat("software"); 
    //object durga software created in heap at runtime 

    String s3 = s2.intern(); 
    // create durga software object in string constant pool as none exist. 

    System.out.println(s2==s3);//should be false but print true in 1.8 version. 

    String s4 = "durgasoftware"; 
    System.out.println(s3==s4);//prints true in both version.. 

} 

답변

1

내가 문자열 풀 PermGen가 ... 나중에, JAVA7에서의 String.intern()이 힙 메모리를 사용하기 시작 ...

link 참조 사용 구현 되었기 때문에이 JAVA6에서 일어나는 것을 말할 것입니다 자세한 내용은 ...

+2

여기서 설명하는 내용은 질문의 프로그램 출력을 변경하지 않습니다. – user2357112

+1

@ user2357112 : Java 8 : 첫 번째 문자열이 문자열 풀에 들어 왔으며 인턴이이 동일한 문자열 풀 항목을 돌려 보냈습니다. Carlitos는 정확합니다. 인턴은 더 이상 특별한 것이 아니라 실제로 불필요합니다. –

0

jls는 무엇이 상수 풀의 일부가되는지 지정합니다. String.intern()에 의해 검색된 문자열 리터럴 및 내용입니다.

일부가 될 때 실제 사양이 없습니다 (처음 사용 또는 리터럴을 정의하는 클래스의로드). 그것은 또한 doesnt 한 것의 일부가되지 않는 상태와 다른 것들이 인턴 될 수 있습니다.

실험에 따르면 문자열이 정수 풀의 일부가 될 때 파트를 변경했다고 생각합니다. 기본적으로 클래스의로드에서 처음 사용으로 변경되었습니다. 그래서 String.intern()은 "this"를 반환 할 수 있으며, 여전히 상수 풀에 이것을 추가하여 처음 사용 된 리터럴과 동일한 인스턴스가됩니다.

2

String.intern()은 String의 정규 인스턴스를 반환합니다. 하지만 당신이 전달한 문자열이 intern() (예 : 호출하는 호출 수신기/개체)에 반환 될 수 있습니다. String이 내부 테이블에 아직없는 경우 발생합니다. 입니다. 이제 정규 인스턴스입니다. . 같은 방법으로 String이 이미 내부 String 테이블에 있으면 intern()이 반환합니다.

String s2 = "web".concat("sarvar"); 
String s3 = s2.intern(); 
System.out.println(s2 == s3); // prints "true" 

String s4 = "web".concat("sarvar"); 
String s5 = s4.intern(); 
System.out.println(s4 == s5); // prints "false" 
+1

'intern'는 인수를 취하지 않습니다. 당신이 의미하는 것을 명확히 할 수 있습니까? –

+1

'prints "false"'- 어, [nope] (http://ideone.com/rEXwSg). 풀에 아직 "websarvar"문자열이 없기 때문에's2'가 풀에 추가되어 반환됩니다. – user2357112

+0

죄송합니다. 예제와 설명이 수정되었습니다. –