2011-10-13 33 views
40

के साथ संगतता बनाम मैं जावा कोड अनुकूलन में काम कर रहा हूं।स्ट्रिंग मान खाली स्ट्रिंग

int intVar = 1; 
String strVar = intVar + ""; 
String strVar = String.valueOf(intVar); 

लाइन 2 और 3 के बीच अंतर क्या है: मैं String.valueOf या +"" संकेत के बीच अंतर के बारे में स्पष्ट नहीं कर रहा हूँ?

+0

संभावित डुप्लिकेट ["+ ) खराब अभ्यास का उपयोग कर स्ट्रिंग में रूपांतरण है?] (Http://stackoverflow.com/questions/1572708/is-conversion-to-string-using-int-value-bad -कदाचार) – Necreaux

उत्तर

54
public void foo(){ 
int intVar = 5; 
String strVar = intVar+"";  
} 

यह दृष्टिकोण परिणामी स्ट्रिंग

public void foo(); 
    Code: 
    0: iconst_5 
    1: istore_1 
    2: new  #2; //class java/lang/StringBuilder 
    5: dup 
    6: invokespecial #3; //Method java/lang/StringBuilder."<init>":()V 
    9: iload_1 
    10: invokevirtual #4; //Method java/lang/StringBuilder.append:(I)Ljava/lan 
g/StringBuilder; 
    13: ldc  #5; //String 
    15: invokevirtual #6; //Method java/lang/StringBuilder.append:(Ljava/lang/ 
String;)Ljava/lang/StringBuilder; 
    18: invokevirtual #7; //Method java/lang/StringBuilder.toString:()Ljava/la 
ng/String; 
    21: astore_2 
    22: return 

public void bar(){ 
int intVar = 5; 
String strVar = String.valueOf(intVar); 
} 

यह दृष्टिकोण केवल String की एक स्थिर विधि invokes पूर्णांक

public void bar(); 
    Code: 
    0: iconst_5 
    1: istore_1 
    2: iload_1 
    3: invokestatic #8; //Method java/lang/String.valueOf:(I)Ljava/lang/Stri 
ng; 
    6: astore_2 
    7: return 
की स्ट्रिंग संस्करण प्राप्त करने के बनाने के लिए StringBuilder का उपयोग करता है

जो बारी में कॉल Integer.toString()

5

मैं valueOf() पसंद करूंगा, क्योंकि मुझे लगता है कि यह अधिक पठनीय और स्पष्ट है।

प्रदर्शन के बारे में कोई भी चिंता माइक्रो-अनुकूलन है जो मापनीय नहीं होगी। मैं उनके बारे में तब तक चिंता नहीं करता जब तक कि मैं माप नहीं ले सकता और देखता हूं कि उन्होंने एक अंतर बनाया है। ताकि वहाँ कुछ अतिरिक्त (और व्यर्थ) करने के लिए काम

3

पहली पंक्ति

String strVal = String.valueOf(intVar) + ""; 

के बराबर है। निश्चित नहीं है कि संकलक खाली स्ट्रिंग अक्षर के साथ concatenations दूर अनुकूलित करता है। यदि ऐसा नहीं होता है (और @ को देख जिगर का जवाब यह जाहिरा तौर पर नहीं करता है), बारी में इस वसीयत

String strVal = new StringBuilder().append(String.valueOf(intVar)) 
         .append("").toString(); 

तो तुम सच में String.valueOf सीधे का उपयोग करना चाहिए हो जाते हैं।

18

अपने आप को कोड का उद्देश्य पूछें।

  • जुटना एक मूल्य
  • साथ एक खाली स्ट्रिंग एक स्ट्रिंग

यह मेरे लिए भी बहुत कुछ बाद की तरह लगता है ... जो है मैं क्यों चाहते करने के लिए एक मूल्य कन्वर्ट: यह करने के लिए है String.valueOf का उपयोग करें। जब भी आप अपना कोड उसी तरह पढ़ सकते हैं जैसे आप वर्णन करना चाहते हैं कि आप क्या हासिल करना चाहते हैं, यह एक अच्छी बात है।

ध्यान दें कि यह सभी प्रकार के लिए काम करता है, और NullPointerException फेंकने के बजाय एक शून्य संदर्भ पारित करने पर "शून्य" वापस कर देगा। यदि आप इस उदाहरण के रूप में कक्षा का उपयोग कर रहे हैं (int नहीं) और आप चाहते हैं तो यह अपवाद फेंकने के लिए है (उदा। क्योंकि यह बग का प्रतिनिधित्व करता है), इसके बजाय संदर्भ पर toString पर कॉल करें।

+2

'स्ट्रिंग .valueOf (int x)' * int * के स्ट्रिंग संस्करण को प्राप्त करने के लिए स्ट्रिंग की बस एक स्थिर विधि का आह्वान करता है। जब हम एंड्रॉइड के बारे में बात करते हैं, तो स्थिर विधियों का उपयोग करके * से बचने की सिफारिश की जाती है। एंड्रॉइड में इस दृष्टिकोण के बारे में आप क्या सोचते हैं? – Machado

1

स्ट्रिंग्स और अन्य चरों को जोड़ना वास्तव में String.valueOf() (और StringBuilder) का उपयोग करता है, इसलिए संकलक उम्मीद है कि खाली स्ट्रिंग को छोड़ दें और दोनों मामलों में एक ही बाइटकोड का उत्पादन करें।

+0

@ जिगार के उत्तर को देखकर यह स्पष्ट रूप से यह अनुकूलन नहीं करता – Thilo

+1

@ थिलो: हालांकि एक से अधिक जावा कंपाइलर हैं। –

0

अनुकूलन के बिंदु से, मैं हमेशा दोनों के बीच String.valueOf() पसंद करूंगा। पहला वाला सिर्फ एक हैक है, intVar के रूपांतरण को String में + ऑपरेटर के रूप में बदलने की कोशिश कर रहा है।

-1
String strVar1 = intVar+""; 
String strVar2 = String.valueOf(intVar); 

strVar1 strVar2 करने के समान है, लेकिन पूर्णांक का उपयोग कर + emptyString "" यह करने के लिए सुरुचिपूर्ण तरीका नहीं है।

valueOf का उपयोग करके अधिक प्रभावी है।

7

String.valueOf(int) का उपयोग करके, या बेहतर, Integer.toString(int) मशीन के लिए अपेक्षाकृत अधिक कुशल है। हालांकि, जब तक प्रदर्शन महत्वपूर्ण नहीं होता है (इस मामले में मैं सुझाव नहीं दूंगा कि आप या तो उपयोग करें) तो ""+ x आपके समय का अधिक कुशल उपयोग है। आईएमएचओ, यह आमतौर पर अधिक महत्वपूर्ण है। कभी-कभी बड़े पैमाने पर अधिक महत्वपूर्ण।

दूसरे शब्दों में, ""+ किसी ऑब्जेक्ट को बर्बाद करता है, लेकिन Integer.toString() वैसे भी कई बनाता है। या तो आपका समय अधिक महत्वपूर्ण है या आप हर कीमत पर वस्तुओं को बनाने से बचना चाहते हैं। आप इस स्थिति में होने की संभावना नहीं रखते हैं कि कई ऑब्जेक्ट्स बनाना ठीक है, लेकिन एक और बनाना नहीं है।

+0

अच्छा वाक्यांश: "फिर" "+ x आपके समय का अधिक कुशल उपयोग है। आईएमएचओ, यह आमतौर पर अधिक महत्वपूर्ण है।" – teddy

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