2013-09-27 12 views
16

क्या हमारे स्वयं के कार्यक्रम में स्ट्रिंग निरंतर पूल की सामग्री तक पहुंचने का कोई तरीका है?क्या हम जावा स्ट्रिंग इंटर्न (स्थिर) पूल तक पहुंच या क्वेरी कर सकते हैं?

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

अब हमारे निरंतर पूल स्ट्रिंग में चारों ओर चल 2 तार कर रहे हैं:

मैं कुछ बुनियादी कोड है कि इस करता है कहो। क्या पूल तक पहुंचने और उपर्युक्त मूल्यों को मुद्रित करने या पूल में मौजूद वर्तमान तत्वों की वर्तमान कुल संख्या प्राप्त करने का कोई तरीका है?

अर्थात

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

होगा कई, कई और अधिक तार निरंतर पूल में --- जो जेडीके कक्षाओं और आपके किसी भी से आते हैं निर्भरता। ध्यान दें कि स्ट्रिंग पूल ** कक्षा लोडिंग ** समय पर भरा हुआ है, और जब वास्तविक कोड स्ट्रिंग स्थिरांक को संदर्भित करता है तो नहीं चलाया जाता है। –

+0

@ मार्कोटोपॉलिक दिलचस्प बिंदु, मैंने यह नहीं माना होगा कि जेडीके कक्षाओं में परिभाषित तार पूल में लोड किए गए होंगे। – CODEBLACK

+0

कक्षा के एक बार लोड होने के बाद, जेडीके कक्षाओं सहित किसी भी वर्ग के लिए यह सच है। – EJP

उत्तर

9

आप सीधे String intern pool उपयोग नहीं कर सकते।

Javadocs प्रति String intern pool के रूप में है:

तार, शुरू में खाली का एक पूल, वर्ग स्ट्रिंग द्वारा निजी तौर परबनाए रखा है।

हालांकि स्ट्रिंग की intern() विधि का उपयोग करके स्ट्रिंग ऑब्जेक्ट्स को इस पूल में जोड़ा जा सकता है।

java.lang.String.intern() एक अंतरराष्ट्रीय स्ट्रिंग पूल में प्रवेश करने वाला एक इंटर्न वाला स्ट्रिंग देता है। यदि स्ट्रिंग पहले से ही वैश्विक स्ट्रिंग पूल में नहीं है, तो इसे जोड़ा जाएगा।

प्रोग्राम आप इस दृष्टिकोण का पालन कर सकते हैं:

  1. घोषित Set<String> StringConstantPool = new HashSet<String>();
  2. कॉल String.intern()
  3. जोड़ें इस पूल में String मान दिया StringConstantPool
+1

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

+2

मुझे 'प्रारंभिक रूप से खाली' लिखकर विश्वास है कि उनका कहना है कि जब JVM लोड करता है तो यह पूल खाली होता है। – anubhava

+3

यह ओओपी बिंदु से केवल निजी नहीं है, बल्कि वास्तव में [मूल विधि के रूप में लागू किया गया है] (http://stackoverflow.com/questions/3323608/how-is-javas-stringintern-method-implemented)। इसका मतलब है कि प्रतिबिंब के साथ भी इसे एक्सेस करना संभव नहीं है। –

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

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