2014-06-05 13 views
19

Gibt es eine Möglichkeit zu überprüfen, welche Strings derzeit im String-Pool vorhanden sind.Wie überprüft man den Inhalt des String-Pools?

Kann ich programmgesteuert alle im Pool vorhandenen Strings auflisten?

oder

Jede IDE bereits diese Art von Plugins?

+1

Zu welchem ​​Zweck? Wie wird es den Ablauf Ihres Programms beeinflussen? – EJP

+1

Beim Lernen des String-Pooling-Konzepts habe ich in Tutorials Beispiele gefunden, die besagen, dass diese Zeichenfolge im String-Pool gespeichert wird und diese nicht. Also dachte ich, wenn dieses Konzept durch das Drucken vorhandener Strings im Pool verdeutlicht werden könnte. Ich benötige es in keinem Auftrag. –

+0

Mögliches Duplikat: http://stackoverflow.com/questions/19049812/can-we-access-or-query-the-java-string-intern-constant-pool –

Antwort

15

Sie können nicht aus Java-Code auf den String-Pool zugreifen, zumindest nicht in der HotSpot-Implementierung von Java VM.

String-Pool in Java wird mit string interning implementiert. Nach JLS §3.10.5:

Zeichenkettenliteral bezieht sich immer auf die gleiche Instanz der Klasse String. Dies liegt daran, dass String-Literale - oder allgemeiner gesagt, Strings, die die Werte von konstanten Ausdrücken (§15.28) sind - "interniert" sind, um eindeutige Instanzen zu teilen, wobei die Methode String.intern verwendet wird.

Und nach JLS §15.28:

Compile-Zeitkonstante Ausdrücke vom Typ ist String immer „interniert“, um eindeutige Instanzen zu teilen, wobei das Verfahren String.intern verwenden.

String.intern ist eine native Methode, wie wir in its declaration in OpenJDK sehen:

public native String intern(); 

The native code for this method Anrufe JVM_InternString Funktion.

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 

Das heißt, String interning mit nativen Code implementiert, und es gibt keinen Java-API direkt den String-Pool zugreifen. Sie können jedoch zu diesem Zweck eine native Methode selbst schreiben.

+0

Die Verwendung des Wortes 'intern' in der JLS ist extrem verwirrend, denn was dort beschrieben wird, ist wirklich Kompilierzeit-String-Pooling. Es hat mit "String.intern()" nichts zu tun. – EJP

+0

Das verstehe ich, aber soweit ich weiß, ist der tatsächliche String-Pool immer noch derselbe. – izstas

+0

Da Sie laut Ihrer Antwort keine Möglichkeit haben, den HotSpot-Quellcode zu lesen und zu berücksichtigen, was in den JVMs anderer Hersteller passiert, können Sie das nicht wissen. In früheren JDKs war der String-Pool eine 'Map' in' java.lang.String' und daher vollständig vom konstanten Pool getrennt. Also war dein Wissen zumindest einmal falsch. Jetzt ist es etwas undurchsichtig. Mehr können Sie nicht wissen. – EJP