2012-10-16 14 views
6

निम्नलिखित स्ट्रिंग वर्गस्ट्रिंग कन्स्ट्रक्टर में 'originalValue.length> आकार' कैसे हो सकता है?

public String(String original) { 
int size = original.count; 
char[] originalValue = original.value; 
char[] v; 
if (originalValue.length > size) { 
    // The array representing the String is bigger than the new 
    // String itself. Perhaps this constructor is being called 
    // in order to trim the baggage, so make a copy of the array. 
     int off = original.offset; 
     v = Arrays.copyOfRange(originalValue, off, off+size); 
} else { 
    // The array representing the String is the same 
    // size as the String, so no point in making a copy. 
    v = originalValue; 
} 
this.offset = 0; 
this.count = size; 
this.value = v; 
} 

के एक निर्माता है लेकिन, मुझे आश्चर्य है कि

if (originalValue.length > size) 

कैसे हो सकता है? टिप्पणी कहती है 'सामान को ट्रिम करें', बैगेज क्या है?

+3

इस स्ट्रिंग क्लास के अन्य रचनाकारों और विधियों को देखें। वास्तविक सामग्री के लिए आवश्यकतानुसार सरणी में एक बड़ी आवंटित स्थान के साथ एक स्ट्रिंग बनाने का कोई तरीका है? –

उत्तर

4

सबस्ट्रिंग पर एक नज़र डालें, और आप देखेंगे कि यह कैसे हो सकता है।

उदाहरण के लिए String s1 = "Abcd"; String s2 = s1.substring(3) लें। यहां s1.size() 1 है, लेकिन s1.value.length 4 है। ऐसा इसलिए है क्योंकि s1.value s2.value जैसा ही है। यह प्रदर्शन कारणों से किया जाता है (सबस्ट्रिंग ओ (1) में चल रहा है, क्योंकि इसे मूल स्ट्रिंग की सामग्री की प्रतिलिपि बनाने की आवश्यकता नहीं है)।

सबस्ट्रिंग का उपयोग करके स्मृति रिसाव हो सकता है। मान लें कि आपके पास वास्तव में एक लंबी स्ट्रिंग है, और आप केवल इसका एक छोटा हिस्सा रखना चाहते हैं। यदि आप बस सबस्ट्रिंग का उपयोग करते हैं, तो आप वास्तव में मूल स्ट्रिंग सामग्री को स्मृति में रखेंगे। String snippet = new String(reallyLongString.substring(x,y)) करना, आपको अब एक बड़ी चार सरणी की आवश्यकता वाले स्मृति को बर्बाद करने से रोकता है।

अधिक स्पष्टीकरण के लिए What is the purpose of the expression "new String(...)" in Java? भी देखें।

+1

'स्ट्रिंग एस 1 = "एबीसीडी" में; स्ट्रिंग s2 = s1.substring (3) ', s1, s2 वास्तव में एक ही मान सरणी '{' a ',' b ',' c ',' d '}' है। उनके बीच अंतर ** ऑफ़सेट ** और ** गिनती ** है। स्ट्रिंग (String.substring (...)) विधि बड़े पैमाने पर सबस्ट्रिंग प्राप्त करने का प्रयास करते समय स्मृति रिसाव से बच सकती है। धन्यवाद ~ – sun

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