2014-06-05 4 views
19

क्या जांचने का कोई तरीका है, वर्तमान में स्ट्रिंग पूल में स्ट्रिंग्स कौन से हैं।स्ट्रिंग पूल सामग्री कैसे जांचें?

क्या मैं प्रोग्राम में सभी स्ट्रिंग्स को प्रोग्राम में सूचीबद्ध कर सकता हूं?

या

किसी भी आईडीई पहले से ही प्लगइन्स इस तरह का है?

+1

किस उद्देश्य के लिए? यह आपके कार्यक्रम के चलने को कैसे प्रभावित करेगा? – EJP

+1

स्ट्रिंग पूलिंग अवधारणा सीखते समय, मुझे ट्यूटोरियल्स में उदाहरण मिले कि यह स्ट्रिंग स्ट्रिंग पूल में जाएगी और यह नहीं। तो मैंने सोचा कि पूल में मौजूदा तारों को प्रिंट करके इस अवधारणा को और स्पष्ट किया जा सकता है। मुझे किसी भी असाइनमेंट में इसकी आवश्यकता नहीं है। –

+0

संभावित डुप्लिकेट: http://stackoverflow.com/questions/19049812/can-we-access-or-query-the-java-string-intern-constant-pool –

उत्तर

15

आप जावा कोड से स्ट्रिंग पूल तक पहुंचने में सक्षम नहीं हैं, कम से कम जावा वीएम के हॉटस्पॉट कार्यान्वयन में नहीं।

जावा में स्ट्रिंग पूल string interning का उपयोग करके लागू किया गया है। JLS §3.10.5 के अनुसार:

एक स्ट्रिंग अक्षर हमेशा कक्षा String के समान उदाहरण को संदर्भित करता है। ऐसा इसलिए है क्योंकि स्ट्रिंग अक्षर - या, आमतौर पर, स्ट्रिंग्स जो निरंतर अभिव्यक्तियों के मूल्य हैं (§15.28) - विधि String.intern का उपयोग करके अद्वितीय उदाहरण साझा करने के लिए "interned" हैं।

और JLS §15.28 के अनुसार:

संकलन समय प्रकार String की लगातार भाव हमेशा इतनी के रूप में अद्वितीय उदाहरण हैं साझा करने के लिए, विधि String.intern का उपयोग कर "प्रशिक्षु" कर रहे हैं।

String.intern, एक देशी तरीका है के रूप में हम its declaration in OpenJDK में देख सकते हैं:

public native String intern(); 

The native code for this method कॉल 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 

है, स्ट्रिंग होना शामिल मूल कोड का उपयोग कर कार्यान्वित किया जाता है, और वहाँ सीधे स्ट्रिंग पूल तक पहुँचने के लिए कोई जावा एपीआई है। हालांकि, आप इस उद्देश्य के लिए खुद को मूल विधि लिखने में सक्षम हो सकते हैं।

+0

जेएलएस में 'इंटर्न' शब्द का उपयोग है बेहद भ्रमित, जैसा कि वर्णन किया जा रहा है वास्तव में संकलन-समय स्ट्रिंग पूलिंग है। यह 'String.intern() के साथ ठीक से कुछ भी नहीं है। – EJP

+0

मैं इसे समझता हूं, लेकिन जहां तक ​​मुझे पता है कि वास्तविक स्ट्रिंग पूल अभी भी वही है। – izstas

+0

आपके उत्तर के अनुसार, हॉटस्पॉट स्रोत कोड पढ़ने से कम, और अन्य विक्रेताओं के जेवीएम में क्या होता है, इस बारे में बताए जाने का कोई तरीका नहीं है, आप इसे जान सकते हैं कि कोई तरीका नहीं है। पहले जेडीके में स्ट्रिंग पूल 'java.lang.String' में 'मानचित्र' था, और इसलिए निरंतर पूल से पूरी तरह अलग है। तो कम से कम एक समय में आपका 'ज्ञान' झूठा था। अब यह कुछ अपारदर्शी है। वास्तव में आप वास्तव में जान सकते हैं। – EJP

संबंधित मुद्दे