2013-09-27 2 views
16

우리 고유의 프로그램 내에서 문자열 상수 풀의 내용에 액세스 할 수 있습니까?Java String 인턴 (상수) 풀에 액세스하거나 쿼리 할 수 ​​있습니까?

String str1 = "foo"; 
String str2 = "bar"; 

지금 우리의 문자열 상수 풀에 주위에 떠있는 두 문자열이 있습니다

내가이 작업을 수행하는 몇 가지 기본적인 코드를 말한다. 풀에 액세스하여 위의 값을 인쇄하거나 현재 풀에 포함 된 요소의 현재 총 개수를 얻는 방법이 있습니까?

StringConstantPool pool = new StringConstantPool(); 
System.out.println(pool.getSize()); // etc 
+6

있을 것 많은, 더 많은 문자열 상수 풀 --- JDK 클래스에서 온 것들과 의존성. 문자열 풀은 ** 클래스 로딩 ** 시간에 채워지며 문자열 상수를 참조하는 실제 코드가 실행될 때가 아닙니다. –

+0

@MarkoTopolnik 흥미로운 점은 JDK 클래스에 정의 된 문자열이 풀에로드되었다고 가정하지 않았을 것입니다. – CODEBLACK

+0

클래스 자체가로드되면 JDK 클래스를 포함한 모든 클래스에 해당됩니다. – EJP

답변

9

사용자가 직접 String intern pool에 액세스 할 수 없습니다. String intern poolJavadocs 당으로

은 다음과 같습니다

처음에 빈 문자열의 풀의 String 클래스에 의해 개인적으로을 유지한다.

그러나 String 개체는 intern() 메서드를 사용하여이 풀에 추가 할 수 있습니다.

java.lang.String.intern()은 interned String 즉, 글로벌 String 풀에 항목이있는 String을 반환합니다. String가 이미 전역 String 풀에없는 경우 추가됩니다. 당신이이 방법을 따를 수 프로그래밍

:

  1. 선언을 Set<String> StringConstantPool = new HashSet<String>();
  2. 전화 String.intern() 추가이 풀에 String 값을 반환
  3. StringConstantPool
+1

Javadoc은 잘못되었고 실제로이 점에서 영원히 모순적입니다. 풀이 '처음에는 비어 있습니다'* 및 * '모든 문자열 리터럴 및 상수 값 문자열 표현식이 금지됩니다.'라는 사실과 String 클래스가 후자를 담당한다는 것은 사실이 아닙니다. 실제로 그것을 인턴으로 생각하는 것은 잘못된 것입니다. – EJP

+2

'처음에는 비어 있음 '을 쓰면 JVM이이 풀을 비울 때 비어 있다고 말할 수 있습니다. – anubhava

+3

OOP 관점에서 볼 때 비공개 일뿐만 아니라 실제로 [네이티브 메소드로 구현되었습니다.] (http://stackoverflow.com/questions/3323608/how-is-javas-stringintern-method-implemented). 즉, 리플렉션을 사용해도 액세스 할 수 없습니다. –