2012-01-12 5 views
3

개체가 인스턴스화 된 후 응용 프로그램에서 String의 생성을 제한하려고합니다. 이 toString가 호출 될 때마다 새로운 String을 생성하는지 궁금합니다. 그것은 나쁜 질문 일지 모르지만 나는 그 해답을 모른다. 제발 제안 해주세요.이 함수는 이것이 호출 될 때마다 새로운 String을 생성합니까?

-

난 그냥 문자열이 생성되는 경우,이 문자열 풀에 저장되어 있음을 기억하고 그 후에는 항상 다시 작성하지 않고 풀에서 검색됩니다. 내가 맞습니까?

+0

모든 문자열이 "문자열 풀"에 저장되는 것은 아니지만 프로그램의 리터럴은 (Skeet이 설명한 것처럼). 그래서 당신의 함수는 새로운 String을 만들지 않습니다. –

답변

9

아니요, 매번 다른 문자열을 생성하지 않습니다. 문자열 상수는 입니다. - 실제로 상수 "NotSubscribed"는 코드 전체에서 동일한 문자열 개체를 참조하며이 메서드가 실행될 때마다가 아닙니다.

section 3.10.5 of the Java Language Specification 가입일

:

각 문자 스트링은 클래스 문자열 (§4.3.3)의 인스턴스에 대한 참조 (§4.3) (§4.3.1, §12.5)이다. String 객체는 상수 값을가집니다. 상수 표현식 (§15.28)의 값인 문자열 리터럴 또는 더 일반적으로 문자열은 String.intern 메서드를 사용하여 고유 한 인스턴스를 공유 할 수 있도록 "격리"됩니다.

그러나 귀하의 편집에 :

는 는

내가하지 않고 단지 문자열이 생성되는 경우,이 문자열 풀에 저장되어 있음을 기억하고 그 후에는 항상 풀에서 검색 다시는 만들어 . 내가 맞습니까?

아니요, 맞지 않습니다. 문자열 상수 인 만 기본적으로 인계됩니다. 예를 들어, 다음 코드를 실행할 때마다 :

public List<String> createStrings() { 
    List<String> list = new ArrayList<String>(); 
    for (int i = 0; i < 10; i++) { 
     list.add("foo" + i); 
    } 
    return list; 
} 

... 그러면 다른 10 개의 문자열이 생성됩니다.

+0

섹션 15.28에 대한 나의 해석은 당신의 예제 ('list.add ("foo")')에서'+ i'를 제거한다면 하나의'String' 만 생성된다는 것입니다. – Robin

+0

@Robin : 예, 맞습니다. –

관련 문제