2012-05-04 19 views
5

मुझे जावा में String एस और StringBuffer एस के उपयोग के बारे में चर्चा हुई थी। इन दो उदाहरणों में से प्रत्येक में कितनी वस्तुएं बनाई गई हैं?कितनी ऑब्जेक्ट्स बनाई गई हैं

पूर्व 1:

String s = "a"; 
s = s + "b"; 
s = s + "c";   

पूर्व 2:

StringBuilder sb = new StringBuilder("a"); 
sb.append("b"); 
sb.append("c"); 

मेरी राय में, पूर्व 1 से 5 पैदा करेगा और पूर्व 2 से 4 वस्तुओं का निर्माण करेगा।

+2

पहला उदाहरण 1 ऑब्जेक्ट बनाएगा क्योंकि संकलक इसे अनुकूलित कर सकता है। –

+0

javac इसे अनुकूलित करेगा? –

+1

उदाहरण 1 इसे उत्पन्न करता है: 'स्ट्रिंग एस = "ए"; एस = (नया स्ट्रिंगबिल्डर (स्ट्रिंग.वैल्यूऑफ (एस))। संलग्न करें ("बी")। ToString(); एस = (नया स्ट्रिंगबिल्डर (स्ट्रिंग.वैल्यूऑफ (एस))। संलग्न करें ("सी")। ToString(); System.err.println (ओं); '। ऐसा लगता है कि जावैक अनुकूलित नहीं कर रहा है (कम से कम जावा 6 में) –

उत्तर

4

आप जावा बाइटकोड का विश्लेषण करके जवाब निर्धारित कर सकते हैं (javap -c का उपयोग करें)। उदाहरण 1 दो StringBuilder ऑब्जेक्ट्स (लाइन # 4 देखें) और दो String ऑब्जेक्ट्स (लाइन # 7 देखें), जबकि उदाहरण 2 एक StringBuilder ऑब्जेक्ट बनाता है (रेखा # 2 देखें)।

ध्यान दें कि आपको char[] ऑब्जेक्ट्स को ध्यान में रखना चाहिए (क्योंकि सरणी जावा में ऑब्जेक्ट्स हैं)। String और StringBuilder ऑब्जेक्ट्स दोनों अंतर्निहित char[] का उपयोग करके लागू किए गए हैं। इस प्रकार, उदाहरण 1 आठ ऑब्जेक्ट्स और उदाहरण 2 बनाता है दो ऑब्जेक्ट्स बनाता है।

उदाहरण 1:

public static void main(java.lang.String[]); 
    Code: 
    0: ldc    #2; //String a 
    2: astore_1 
    3: new    #3; //class java/lang/StringBuilder 
    6: dup 
    7: invokespecial #4; //Method java/lang/StringBuilder."<init>":()V 
    10: aload_1 
    11: invokevirtual #5; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 
    14: ldc    #6; //String b 
    16: invokevirtual #5; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 
    19: invokevirtual #7; //Method java/lang/StringBuilder.toString:()Ljava/lang/String; 
    22: astore_1 
    23: new    #3; //class java/lang/StringBuilder 
    26: dup 
    27: invokespecial #4; //Method java/lang/StringBuilder."<init>":()V 
    30: aload_1 
    31: invokevirtual #5; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 
    34: ldc    #8; //String c 
    36: invokevirtual #5; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 
    39: invokevirtual #7; //Method java/lang/StringBuilder.toString:()Ljava/lang/String; 
    42: astore_1 
    43: return 
} 

उदाहरण 2:

public static void main(java.lang.String[]); 
    Code: 
    0: new    #2; //class java/lang/StringBuilder 
    3: dup 
    4: ldc    #3; //String a 
    6: invokespecial #4; //Method java/lang/StringBuilder."<init>":(Ljava/lang/String;)V 
    9: astore_1 
    10: aload_1 
    11: ldc    #5; //String b 
    13: invokevirtual #6; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 
    16: pop 
    17: aload_1 
    18: ldc    #7; //String c 
    20: invokevirtual #6; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 
    23: pop 
    24: return 
} 
+0

मुझे थोड़ा संदेह है। , ओरेकल दस्तावेज़ यहां http://docs.oracle.com/javase/7/docs/api/java/lang/StringBuilder.html यह संलग्न करने के बारे में कहता है: "सार्वजनिक स्ट्रिंगबिल्डर संलग्न (ऑब्जेक्ट obj) स्ट्रिंग का प्रतिनिधित्व करता है ऑब्जेक्ट तर्क समग्र प्रभाव बिल्कुल ठीक है जैसे तर्क स्ट्रिंग.valueOf (ऑब्जेक्ट) विधि द्वारा स्ट्रिंग में परिवर्तित किया गया था, और उस स्ट्रिंग के वर्णों को तब इस वर्ण अनुक्रम में जोड़ा गया था। " क्या इसका मतलब यह नहीं है कि स्ट्रिंग अक्षर के लिए ऑब्जेक्ट बनाए जाएंगे। –

5

बनाई गई वस्तुओं के संदर्भ में:

StringBuffer sb = new StringBuffer("a"); // 1 StringBuffer + 1 char[] (in SB) 
sb.append("b"); // 0 
sb.append("c"); // 0 

निष्पक्ष बनाने के लिए मुझे लगता है कि नया पता नहीं था:

String s = "a"; // No object created 
s = s + "b"; // 1 StringBuilder/StringBuffer + 1 String + 2 char[] (1 for SB and 1 for String) 
s = s + "c"; // 1 StringBuilder/StringBuffer + 1 String + 2 char[] (1 for SB and 1 for String) 

उदाहरण 2 2 ऑब्जेक्ट बनाएगी:

उदाहरण 1 8 वस्तुओं बनाता है char [] वास्तव में जावा में एक ऑब्जेक्ट बनाया (लेकिन मुझे पता था कि वे बनाए गए थे)। उस बिंदु को इंगित करने के लिए Aix के लिए धन्यवाद।

+0

डाउनवॉटर क्या आप अपनी राय प्रदान करना चाहते हैं? –

+0

वह किसी अन्य जेडीके संस्करण में परीक्षण प्रक्रिया चला सकता था और विभिन्न परिणाम प्राप्त कर सकता था। –

5

मैं एक स्मृति प्रोफाइलर का उपयोग किया है सटीक गिनती प्राप्त करने के लिए।

मेरी मशीन पर, पहला उदाहरण 8 वस्तुओं बनाता है: प्रकार String की

String s = "a"; 
s = s + "b"; 
s = s + "c"; 
  • दो वस्तुओं;
  • StringBuilder प्रकार के दो ऑब्जेक्ट्स;
  • के चार ऑब्जेक्ट्स।

दूसरी ओर, दूसरे उदाहरण:

StringBuffer sb = new StringBuffer("a"); 
sb.append("b"); 
sb.append("c"); 

2 वस्तुओं बनाता है:

  • एक प्रकार StringBuilder की वस्तु;
  • प्रकार का एक ऑब्जेक्ट।

यह जेडीके 1.6u30 का उपयोग कर रहा है।

पीएस तुलना निष्पक्ष बनाने के लिए, आपको शायद दूसरे उदाहरण के अंत में sb.toString() पर कॉल करना होगा।

+0

यह मशीन/कंपाइलर-निर्भर है? –

+0

@AlexLockwood: शायद जेडीके-कुछ हद तक निर्भर है, हालांकि हाल ही में जेडीके में बहुत अधिक परिवर्तनशीलता होने पर मुझे आश्चर्य होगा। – NPE

+0

ऐसा लगता है कि जावा [पी 'जैसी उच्च स्तरीय भाषा में' char [] 'और यह' स्ट्रिंग 'अबास्ट्रक्शन के बीच अंतर करने के लिए मूर्खतापूर्ण लगता है। लेकिन मैं मानता हूं कि ऐसा करने के लिए सही है (आपके हिस्से पर मूर्ख नहीं ... इस तरह के बेवकूफ उदाहरण में मूर्खतापूर्ण)। –

-1

उत्तर भाषा (कंपाइलर और रनटाइम पुस्तकालयों) के विशिष्ट कार्यान्वयन से जुड़ा हुआ है। विशिष्ट अनुकूलन विकल्पों की उपस्थिति तक या नहीं। और, ज़ाहिर है, कार्यान्वयन का संस्करण (और, जाहिर है, जेएलएस के साथ यह अनुपालन है)। तो, मिनीमा और मैक्सिमा की अवधि में बात करना बेहतर है। वास्तव में, यह अभ्यास बेहतर

Ex1 के लिए, वस्तुओं की न्यूनतम संख्या 1 है (संकलक को पता चलता है कि केवल स्थिरांक शामिल हैं और String s= "abc" ; के लिए केवल कोड उत्पन्न करते हैं)। कार्यान्वयन के आधार पर अधिकतम कुछ भी हो सकता है, लेकिन एक उचित अनुमान 8 है (कुछ अन्य कॉन्फ़िगरेशन द्वारा उत्पादित संख्या के रूप में भी दिया गया है)।

एक्स 2 के लिए, वस्तुओं की न्यूनतम संख्या 2 है। कंपाइलर को यह जानने का कोई तरीका नहीं है कि क्या हमने स्ट्रिंगबिल्डर को अलग-अलग अर्थशास्त्र के साथ कस्टम संस्करण के साथ बदल दिया है, इसलिए यह अनुकूलित नहीं होगा। अधिकतम मेमोरी-संरक्षित स्ट्रिंगबिल्डर कार्यान्वयन के लिए अधिकतम 6 हो सकता है जो एक समय में char[] सरणी एक वर्ण का समर्थन करता है, लेकिन ज्यादातर मामलों में यह 2 भी होगा।

+0

कंपाइलर 'स्ट्रिंग एस = "एबीसी" के लिए कोड बनाता है;' ', लेकिन यह निष्पादित होने पर ऑब्जेक्ट नहीं बनाता है, इसलिए न्यूनतम वास्तव में शून्य है। – EJP

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