2011-08-08 1 views
0

한 가지 :자바에서 문자열과 메모리 할당? 나는이 같은 방법이 있다면 난 항상 궁금

String replaceStuff (String plainText) { 
     return plainText.replaceAll("&", "&"); 
} 

는 새로운 문자열을 만듭니다는 "&"과 "&"는 GC에 의해 파괴됩니다 및 모든 시간을 객체 다음 전화로 다시 만들었습니까? 예. 이 이론에 내가이 아마 실제 문제보다 더 이론적 문제라고 생각이

final String A ="&"; 
final String AMP ="&"; 

    String replaceStuff (String plainText) { 
      return plainText.replaceAll(A, AMP); 
    } 

처럼 뭔가를 더 나은 것, 나는 메모리 관리는이 측면에서 처리하는 방법 그냥 궁금입니다.

답변

4

아니요. 문자열 리터럴은 허용되지 않습니다. 당신이 다른 곳에서 동일한 문자 (또는 다른 일정)를 사용하는 경우에도 같은 객체를 참조합니다 :

Object x = "hello"; 
Object y = "he" + "llo"; 

System.out.println(x == y); // Guaranteed to print true. 

편집 : 섹션 3.10.5

문자열의 JLS는 보장이 리터럴 또는보다 일반적으로 상수 식 (15.28)의 값인 문자열은 String.intern 메서드를 사용하여 고유 한 인스턴스를 공유 할 수 있도록 "중 단"됩니다.

15.28 절은 두 개의 다른 상수로부터 새로운 상수를 생성 할 수있는 연산으로 포함 된 + 연산자를 보여줍니다.

+0

'Object y = "hello"'는 보장되지만, "he"+ "llo"'에 대한 컴파일러 최적화도 보장됩니까? (나는 묻지 만, 도전하지 않는다 :-)) –

+0

그 좋은 예입니다! – Vlad

+1

@Sean : 또한 보장됩니다. JLS의 §3.10.5에있는 [이 부분] (http://java.sun.com/docs/books/jls/third_edition/html/lexical.html#19369) : "문자열 리터럴 또는 더 일반적으로는 , 상수 표현 (§15.28)의 값인 문자열 - "interned"[...] " –

3

아니요, 아니요, 리터럴이므로 자동으로 상수 풀에 수용됩니다.

유일한 방법은 당신이 새로운 문자열을 만들 것마다 할 것 :

String replaceStuff (String plainText) { 
    return plainText.replaceAll(new String("&"), new String("&")); 
} 
1

문자열은 GC에 의한 정상 개체에 비해 조금 다른 처리됩니다. 예 :

String a = "aaa"; String a1 = "aaa";

이제 a와 a1은 값이 변경 될 때까지 메모리의 동일한 문자열 값을 가리 킵니다. 따라서 메모리에는 오직 하나의 객체 만 존재합니다.

다른 문자열을 가리 키도록 'a'및 'a1'을 변경하면 필요에 따라 나중에 값 "aaa"가 문자열 풀에 남아 있으며 나중에 JVM에서 사용됩니다. 문자열이 GC'd가 아님

+0

사실 이들은 GC에 의해 처리되는 것이 아니라 공사 중에 다릅니다. –

+0

이것은 컴파일 타임 문자열 * 상수 *에주의해야합니다. 다른 방법으로 생성 된 문자열은 자동으로 구속되지 않습니다. –

관련 문제