Ответ 1
Вы не можете получить доступ к пулу строк из Java-кода, по крайней мере, не в реализации Java-приложения HotSpot.
Пул строк в Java реализуется с помощью интернирования строк. Согласно JLS §3.10.5:
строковый литерал всегда ссылается на тот же экземпляр класса
String
. Это связано с тем, что строковые литералы, или, в более общем смысле, строки, которые являются значениями константных выражений (§15.28), "интернированы", чтобы обмениваться уникальными экземплярами, используя методString.intern
.
И согласно JLS §15.28:
Выражения константы времени компиляции типа
String
всегда "интернированы", чтобы обмениваться уникальными экземплярами, используя методString.intern
.
String.intern
является нативным методом, как мы видим в его декларации в OpenJDK:
public native String intern();
Нативный код для этого метода вызывает функцию JVM_InternString
.
JVM_ENTRY(jstring, JVM_InternString(JNIEnv *env, jstring str))
JVMWrapper("JVM_InternString");
JvmtiVMObjectAllocEventCollector oam;
if (str == NULL) return NULL;
oop string = JNIHandles::resolve_non_null(str);
oop result = StringTable::intern(string, CHECK_NULL);
return (jstring) JNIHandles::make_local(env, result);
JVM_END
То есть, интернирование строк выполняется с использованием собственного кода, и нет Java API для прямого доступа к пулу строк. Тем не менее, вы можете написать собственный метод самостоятельно для этой цели.