2013-07-27 9 views
38

मेरे दोस्त ने मुझे एक सवाल वह स्ट्रिंग वस्तुओं के बारे में जावा प्रमाण पत्र के लिए एक नकली परीक्षा में देखा था भेजा:जावा में कितनी स्ट्रिंग ऑब्जेक्ट्स?

String makeStrings(){ 
    String s = "HI"; 
    s = s + "5"; 
    s = s.substring(0,1); 
    s = s.toLowerCase(); 
    return s.toString(); 
} 

कितने स्ट्रिंग वस्तुओं जब इस पद्धति शुरू हो जाती है बनाया जाएगा? परीक्षा का सही उत्तर दिया गया था 3. लेकिन मुझे लगता है कि यह पांच है।

  1. "HI"
  2. "5"
  3. "हाई 5"
  4. "एच"
  5. "h"

मैं गलत हूँ?

+14

मुझे संदेह है कि अंतर यह है कि "HI" और "5" स्ट्रिंग पूल में पहले से ही हैं, इसलिए वे प्रत्येक विधि आमंत्रण पर नहीं बनाए गए हैं। –

+1

@GrijeshChauhan मैंने एसओ मेटा पर एक [पोस्ट] बनाया है (http://meta.stackexchange.com/questions/190688/determining-whether-a-post-should-be-marked-as-a-duplicate#190689)। इस पोस्ट को बंद करने के बजाय, मुझे लगता है कि हमें दूसरे को बंद करने के लिए वोट देना चाहिए। शायद मैं पक्षपातपूर्ण हूं, लेकिन मुझे लगता है कि ये उत्तर बेहतर हैं ... –

+1

@SteveP। मैंने इसे पहले से ही डुप्लिकेट विकल्प के साथ बंद करने के लिए वोट दिया ... –

उत्तर

46
String makeStrings() { 
    String s = "HI";   //String literal 
    s = s + "5";    //concatenation creates new String object (1) 
    s = s.substring(0,1);  //creates new String object (2) 
    s = s.toLowerCase();  //creates new String object (3) 
    return s.toString();  //returns already defined String 
} 

संयोजन के संबंध में, जब एक नया स्ट्रिंग बनाने, JVMStringBuilder का उपयोग करता है, अर्थात्:

s = new StringBuilder(s).append("5").toString(); 

toString() एक StringBuilder के लिए है:

public String toString() { 
    return new String(value, 0, count); //so a new String is created 
} 

substring एक नया स्ट्रिंग बनाता है ऑब्जेक्ट जब तक संपूर्ण String अनुक्रमणित है:

public String substring(int beginIndex, int endIndex) { 
    if (beginIndex < 0) { 
     throw new StringIndexOutOfBoundsException(beginIndex); 
    } 
    if (endIndex > count) { 
     throw new StringIndexOutOfBoundsException(endIndex); 
    } 
    if (beginIndex > endIndex) { 
     throw new StringIndexOutOfBoundsException(endIndex - beginIndex) 
    } 

    return ((beginIndex == 0) && (endIndex == count)) ? this : 
      new String(offset + beginIndex, endIndex - beginIndex, value); 
} 

toString() करता नहीं एक नया स्ट्रिंग बनाने के लिए:

public String toString() 
{ 
    return this; 
} 

toLowerCase() एक बहुत लंबा तरीका है, लेकिन यह पर्याप्त कहना है कि अगर Stringनहीं पहले से ही है सभी लोअरकेस, यह new String लौटाएगा।

यह देखते हुए कि प्रदान किया गया उत्तर है, जैसा कि जॉन स्कीट ने सुझाव दिया था, हम मान सकते हैं कि दोनों स्ट्रिंग अक्षर पहले ही स्ट्रिंग पूल में हैं। पूल में स्ट्रिंग जोड़े जाने के बारे में अधिक जानकारी के लिए, Questions about Java's String pool देखें।

+1

सबस्ट्रिंग एक नई स्ट्रिंग ऑब्जेक्ट बनाता है, toString – Joni

+0

'substring' यहां कोई ऑब्जेक्ट नहीं बनाएगा। यह वही स्ट्रिंग केवल तभी देता है जब आपके सूचक मूल स्ट्रिंग की सीमाओं पर हों- '[0, s.length() - 1] ' –

+0

@ जॉनी, मुझे एहसास नहीं हुआ कि यह वास्तव में' toString()' पर कॉल कर रहा था स्ट्रिंग। मैंने आवश्यक परिवर्तन किए (दोनों के लिए)। धन्यवाद। –

13

s = s + "5";

में अनुवाद किया है:

String s = new StringBuilder(s).append("5").toString(); 

के लिए अब, एक वस्तु बन जाता है।


s = s.substring(0,1); 

एक नया स्ट्रिंग बनाता है।


s = s.toLowerCase(); 

एक नई वस्तु बनाता है।


return s.toString(); 

एक स्ट्रिंग का निर्माण नहीं करता है, यह एक पहले से ही बनाई गई एक देता है।

+0

"s.toString();" एक ही स्ट्रिंग देता है? क्या आपको यकीन है? – Lokesh

+7

@ लोकी हाँ .. 'toString() {इसे वापस करें}' – sanbhat

9

कुछ अन्य उत्तरों को समझ में आता है, लेकिन स्ट्रिंग अक्षर के बारे में क्या?

String s = "HI"; 

स्ट्रिंग शाब्दिक, जब एक जावा फाइल एक .class फ़ाइल में संकलित किया गया है के लिए, किसी भी स्ट्रिंग शाब्दिक एक विशेष तरीके से उल्लेख कर रहे हैं, सभी स्थिरांक हैं बस के रूप में। जब एक वर्ग लोड होता है (ध्यान दें कि लोडिंग प्रारंभ होने से पहले होती है), JVM वर्ग के लिए कोड के माध्यम से जाता है और स्ट्रिंग अक्षर की तलाश करता है।

जब यह एक पाता है, यह अगर एक बराबर स्ट्रिंग पहले से ही ढेर से संदर्भित है देखने के लिए जाँच करता है। यदि नहीं, तो यह ढेर पर एक स्ट्रिंग उदाहरण बनाता है और निरंतर तालिका

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

इसलिए चार जावा ऑब्जेक्ट्स होना चाहिए, हालांकि जब एक ही विधि को बार-बार कहा जाता है तो आवेदन में केवल तीन ऑब्जेक्ट होंगे जैसे स्ट्रिंग शाब्दिक पूल में शाब्दिक "HI" होता है।

इसके अलावा, क्यों नए ऑब्जेक्ट का निर्माण होगा जब उपरोक्त विधि ब्लॉक exectued कर रहे हैं हम भी हैश कोड (String अपरिवर्तनीय जा रहा है।)

public static void main(String[] args) 
    { 
     NumberOfString str = new NumberOfString(); 
     String s = str.makeStrings(); 
     System.out.println(s.hashCode()); 
    } 

    public String makeStrings() 
    { 
     String s = "HI"; 
     System.out.println(s.hashCode()); 
     s = s + "5"; 
     System.out.println(s.hashCode()); 
     s = s.substring(0, 1); 
     System.out.println(s.hashCode()); 
     s = s.toLowerCase(); 
     System.out.println(s.hashCode()); 
     return s.toString(); 
    } 

आप मिलता है जो विभिन्न स्ट्रिंग्स के लिए अलग हैं की जाँच कर सकते बारे में अधिक जानकारी के लिए निम्नलिखित उत्पादन:

2305 
71508 
72 
104 
104 

हम ऊपर के उदाहरण में स्ट्रिंग शाब्दिक वस्तु में गिनती नहीं करना चाहिए?

+0

ओपी के प्रश्न में दिए गए उत्तर के आधार पर, हम मान सकते हैं कि वे पहले से ही स्ट्रिंग पूल में हैं। फिर भी, अच्छा जवाब (+1)। –

+1

मूल प्रश्न बताता है कि "इस विधि को लागू होने पर कितनी स्ट्रिंग ऑब्जेक्ट्स बनाई जाएंगी?", यह बताते हुए कि कक्षा पहले ही लोड हो चुकी है और विधि को कोड के दूसरे भाग से बुलाया जा रहा है। आपके स्पष्टीकरण के आधार पर, स्ट्रिंग शब्दकोष तब बनाया जाता है जब वर्ग लोड होता है, विशेष रूप से जब यह विधि लागू नहीं होती है, और इसलिए कुल प्रश्न की गणना नहीं की जाएगी। – Pawn

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