2013-03-21 2 views
3

나는 많은 수의 문자열을 저장했습니다. 값은 자주 변경되지 않습니다.string.intern은 메모리를 덜 사용합니다.

string.intern()은 참조만을 반환하기로되어 있기 때문에, 나는 ArrayList에 저장된 1 억 개의 똑같은 문자열 목록을 모두 사용했습니다.

Java 메모리가 줄어들 것으로 예상되었지만 일반적인 문자열과 내부 문자열을 비교하면 .1 % 미만의 차이가 나타납니다.

나는 뭔가를 놓치고 또는이 예상 된 행동입니까?

리스트 생성 코드

long max = 100000000; 
    for(int i =0 ; i < max;i++){ 
     list.add("sometextelidedforbrevity".intern()); 
    } 

메모리 사용없이 1 242 3백60킬로바이트 1 242 1백84킬로바이트으로한다.

+0

어떻게 이러한 문자열을 만드십니까? 코드를 보여주세요. 그들은 이미 구금되어있을 수도 있습니다. – cdhowie

+4

문자열 리터럴 또는'new String()'을 사용하고 있습니까? 문자열 리터럴은 자동으로 금지되므로 ... –

+0

사용중인 메모리 양은 어느 정도입니까? –

답변

4

문자열 리터럴은 자동으로 금지됩니다. 즉, 표현 "sometextelidedforbrevity"은 항상 런타임에 interned 된 객체 참조 String이됩니다. 이미 interned 된 문자열에 intern()을 호출하는 것은 효과가 없습니다.

0

필자는 설명서에서 간과 한 String 리터럴을 사용하고 있었으며 cdhowie와 Russel Zahniser 덕분에 주석에 답했습니다.

이들은 입니다. 이미은 리터럴을 사용하여받습니다.

Strings를 사용하지 못하게하는 유일한 방법은 new String()입니다.

관련 문제