2014-06-05 29 views
19

Dize havuzunda hangi Dizeleri bulunduğunu kontrol etmek için herhangi bir yöntem var mı?Dize Havuz İçeriği nasıl kontrol edilir?

Tüm Dizeleri havuzda programlı olarak listeleyebilir miyim?

veya

Herhangi IDE zaten eklentileri bu tür var mı?

+1

Hangi amaçla? Programınızın çalışmasını nasıl etkileyecek? – EJP

+1

Dize Havuzları konseptini öğrenirken, bu dizenin dize havuzuna gireceğini ve bunun olmadığını söyleyen derslerde örnekler buldum. Bu yüzden havuzdaki mevcut dizeleri basarak bu kavramın daha net hale getirilebileceğini düşündüm. Herhangi bir görevde buna ihtiyacım yok. –

+0

Olası kopya: http://stackoverflow.com/questions/19049812/can-we-access-or-query-the-java-string-intern-constant-pool –

cevap

15

Java havuzundan, en az Java VM'nin HotSpot uygulamasında değil, string havuzuna erişemezsiniz.

Java'da dize havuzu string interning kullanılarak uygulanır. JLS §3.10.5 göre:

daima değişmez bir dize sınıfının String aynı örneğe karşılık gelir. Bunun nedeni, dize değişmezleri - veya daha genel olarak, sabit ifadelerin (§15.28) değerleri olan dizeler, String.intern yöntemini kullanarak benzersiz örnekleri paylaşacak şekilde "dahil edilir".

Ve JLS §15.28 göre: yöntemini String.intern kullanarak, birbirinden farklı örneklerini paylaşmak amacıyla tip String ait

Derleme zamanı sabiti ifadeler her zaman "staj" vardır.

public native String intern(); 

The native code for this method çağrı JVM_InternString fonksiyonu: Biz its declaration in OpenJDK görebileceğiniz gibi

String.intern doğal bir yöntemdir. olduğu

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 

, dize stajyerlik yerel kod kullanılarak uygulanır ve doğrudan dize havuzundan hiçbir Java API var. Bununla birlikte, bu amaç için kendinize yerel bir yöntem yazabilirsiniz.

+0

JLS'de 'intern' kelimesinin kullanımı Son derece kafa karıştırıcı, tarif edildiği gibi gerçekten derleme zamanı dizisi havuzu var. Bu String.intern() ile hiçbir ilgisi yoktur. ' – EJP

+0

Bunu anlıyorum, ama bildiğim kadarıyla gerçek dize havuzu hala aynı. – izstas

+0

Cevabınıza göre, HotSpot kaynak kodunu okumanın ve diğer satıcıların JVM'lerinde ne olduğunu hesaba katmanın bir yolu yoktur, bunu bilmenin bir yolu yoktur. Daha önceki JDK'larda dize havuzu, java.lang.String'de bir 'Harita' idi ve bu nedenle sabit havuzdan tamamen ayrıydı. Yani bir zamanlar en azından 'bilgin' yanlıştı. Şimdi opak bir şey. Aslında bildiğin her şey bu. – EJP

İlgili konular