2010-06-02 4 views
5

다음 코드상수 문자열이 생성/삭제되는시기는 언제입니까? 이러한 문자열이 작성되면

public static void method(String[] srgs){ 
try{ 

}catch(){ 
System.out.println("Hello World" + "one");} 
catch(..){ 
System.out.println("Hello World" + "two");} 
catch(..){ 
System.out.println(getString());} 
} 
  1. 을 고려? 나는 런타임에 예외가 발생할 때 문자열이 생성 될 것이라고 가정합니다. 문자열은 런타임에 작성되어 표시됩니다. 내 동료는 그들이 클래스가로드되는 즉시 만들어지는 일정한 문자열이므로 나에게 알려줍니다. 그 맞습니까?

  2. 문자열은 언제 수집됩니까? 쓰레기 수거는하고 있습니까? 동일한 메소드가 프로그램에서 여러 번 호출 될 수 있다고 가정하면 캐시하는 것만으로는 충분하지 않습니까?

답변

6
  1. 이 문자열은 사실 상수 문자열에있는 클래스의 정수 풀에있을 것입니다 및 클래스가로드 될 때 따라서 JVM에서 인스턴스화됩니다. +으로 생성된다는 사실은 문제가되지 않습니다. 전체 문자열은 여전히 ​​상수입니다. 즉, "Hello Worldone""Hello Worldtwo"을 작성한 경우와 완전히 동일합니다. 이러한 규칙은 JLS의 § 3.10.5 String Literals에 설명되어 있습니다.

  2. String 개체는 다른 개체가 가비지 수집되는 것과 같은 방식으로 가비지 수집됩니다. 개체에 대한 본질적으로 다른 것은 없습니다. 그러나some String are interned (특히 이것은 모든 문자열 리터럴을 포함합니다). 가비지 수집을 방지하거나 방지 할 수 있습니다 (정의되지 않았으며 구현에 따라 다릅니다).

    클래스가로드 된 상태로 유지되는 한 이러한 문자열 상수는 계속 존재하며 가비지 수집되지 않습니다.

+0

요아킴에게 감사드립니다. SOP ("Hello World"+ getstr())를 고려해보십시오.이 경우 여전히 상수 문자열이 생성됩니까? 이 줄이 실행되면 두 번째 문자열이 생성됩니까? 2 번째 String 쓰레기는 수집 되었습니까? 당신은 내가 1 점에 대답 한 곳에서 저에게 소식을 주시겠습니까? – Geek

+1

JLS의 관련 섹션을 연결했습니다. ''HelloWorld "+ getstr()'은 ** String ** 리터럴이 아닙니다. 새로운'String' 객체는 라인이 실행될 때마다 만들어지며 그 객체는 정상적으로 가비지 수집됩니다. –

+0

@JoachimSauer "HelloWorld"+ getstr()의 경우 1. 클래스가로드 될 때 "HelloWorld"가 여전히 생성됩니까? 2. 문자열에서 가비지 수집을 중지하지 않으려면 무엇을 사용해야합니까? 새로운 String ("HelloWorld")가 도움이됩니까? – Jaskey