2012-04-06 2 views
0

내가이 같은 상황이있는 경우 자바생성되는 객체의 수는 얼마입니까? 시나리오 1 :

에서 풀링 Stringz 인스턴스 주위에 간단한 질문을했다

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

을 다음 시나리오 2 이성을 상실 :에서

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

을 각 경우 - 얼마나 많은 객체가 문자열 풀 및 힙에 만들어지고 있습니까? 둘 다 동일한 수의 개체를 만들 것이라고 가정했습니다 (2 개의 개체 - String 풀의 각 시나리오에서 두 줄 모두에 대해 하나의 "aaa"와 새 운영자에 대해 하나씩). iview에서 이것이 올바르지 않다고 들었습니다. 제 이해에 무엇이 잘못되었는지 궁금합니다.

+1

어떤 언어입니까? – EdChum

+0

나의 나쁜 - 이것은 자바에있다! –

+0

실제로 이것은 올바른 설명입니다. http://stackoverflow.com/questions/1881922/questions-about-javas-string-pool – evanwong

답변

1

"aaa"의 문자열은 클래스가로드 될 때 만들어지고 풀링되므로 두 줄이 코드가 실행될 때 일 때 하나의 새로운 String 만 만들어집니다.

명확해야 : 두 예제 모두 실행시 하나의 새 String 객체 만 만듭니다. 리터럴은 문자열 "aaa"가 포함 된 클래스가 처음 사용될 때 만들어집니다.

class FooBar{ 
    void foo(){ 
    String s1 = "aaa";//the literal already exists 
    String s2 = new String("aaa");//creates string for s2 
    } 
    void bar(){ 
    String s1 = new String("aaa"); //creates string for s1 
    String s2 = "aaa";//the literal already exists 
    } 
} 

class Test{ 

    public void main(String... args){ 
     ... 
     //first time class FooBar used in program, class with literals loaded 
     FooBar fb = new FooBar(); 
     //creates one string object, the literal is already loaded 
     fb.bar(); 
     //also creates one string object, the literal is already loaded 
     fb.foo(); 
    } 
} 
+0

기술적으로는 옳지 만 정확히 어떤 일이 발생했는지 자세히 설명 할 수 있습니까? 시각? –

+0

두 경우 모두를 암시합니까? 마이클이 너처럼 정교 할 수 있다고 말했어? –

1

답변은 인터뷰에서 말한 것처럼 두 경우 모두 힙에서 1 인스턴스이고 문자열 풀에서 1 인스턴스입니다.

Strings가 상주 할 수있는 두 개의 공백이 있습니다. 묵인 된 문자열이 저장된 힙 및 perm gen.

String 생성자는 힙에 String을 만듭니다. 문자열 리터럴은 영구 생성에서 String 풀에 만들어집니다. 힙의 문자열은 String.intern() 문자열을 사용하여 String 풀로 이동할 수 있습니다 (즉, 풀에있는 동일한 문자열에 대한 참조를 결정하거나 이미없는 경우 동일한 문자열을 생성하고 참조를 반환합니다). 인턴 된 문자열에.

편집 : 내가 답한 내용을 확인하려면 각 예제에 System.out.println(s1 == s2);을 세 번째 줄로 추가하십시오. 두 경우 모두에서 false를 인쇄하여 두 객체가 서로 다른 메모리 주소를 가지고 있음을 증명합니다.

+0

잘 설명 된 답변에 대해 투표하십시오. – gifpif

관련 문제