Integer.toString (int i) बनाम String.valueOf (int i)


176

मैं सोच रहा हूँ कि विधि क्यों String.valueOf(int i)मौजूद है? मैं इस पद्धति का उपयोग कर रहा हूँ कन्वर्ट करने के लिए intमें Stringऔर बस की खोज की Integer.toString(int i)विधि।

इन विधियों के कार्यान्वयन को देखने के बाद मैंने देखा कि पहला एक दूसरे को बुला रहा है। परिणामस्वरूप मेरे सभी कॉल में String.valueOf(int i)सीधे कॉल करने की तुलना में एक और कॉल शामिल हैInteger.toString(int i)


3
बस संदर्भ उद्देश्यों के लिए: stackoverflow.com/questions/3335685/integer-tostring
बॉबी

जवाबों:


46

एक ही काम को करने के बस दो अलग-अलग तरीके। यह एक ऐतिहासिक कारण हो सकता है (याद नहीं कर सकता है कि एक दूसरे से पहले आया था)।


22
हां, लेकिन अगर कुछ ऐसा ही कर रहे हैं, तो इसका मतलब यह नहीं है कि वही चीजें हैं।
डेमियन लेस्ज़्ज़स्की - वश

3
String.valueOf (int) सिर्फ Integer.toString (i) को सीधे कॉल करता है। तो Integer.toString (int) को कॉल करना सबसे अच्छा है।
djchapm

171

स्ट्रिंग प्रकार में हमारे पास कई विधि मान हैं

static String   valueOf(boolean b) 
static String   valueOf(char c) 
static String   valueOf(char[] data) 
static String   valueOf(char[] data, int offset, int count) 
static String   valueOf(double d) 
static String   valueOf(float f) 
static String   valueOf(int i) 
static String   valueOf(long l) 
static String   valueOf(Object obj) 

जैसा कि हम देख सकते हैं कि यह पद्धति सभी प्रकार की संख्याओं को हल करने में सक्षम है

आपके द्वारा प्रस्तुत की गई विशिष्ट पद्धति का प्रत्येक कार्यान्वयन: तो पूर्णांकों के लिए हमारे पास है

Integer.toString(int i)

डबल के लिए

Double.toString(double d)

और इसी तरह

मेरी राय में यह कुछ ऐतिहासिक बात नहीं है, लेकिन एक डेवलपर के लिए valueOfस्ट्रिंग प्रकार की विधि का उचित प्रकार से उपयोग करना अधिक उपयोगी है , क्योंकि यह हमारे लिए कम बदलाव लाता है।

नमूना 1:

public String doStuff(int num) {

  // Do something with num...

  return String.valueOf(num);

 }

Sample2:

public String doStuff(int num) {

 // Do something with num...

 return Integer.toString(num);

 }

जैसा कि हम नमूना 2 में देखते हैं, हमें नमूना एक के विपरीत, दो बदलाव करने होंगे।

मेरे निष्कर्ष में, valueOfस्ट्रिंग कक्षा से विधि का उपयोग करना अधिक लचीला है और इसलिए यह वहां उपलब्ध है।


18
और यह मत भूलो Integer.toString(int i, int radix)कि 10. के अलावा अन्य ठिकानों के तार में परिवर्तित हो जाएंगे
स्टीफन पी

@Vash आप स्ट्रिंग को String.valueOf की तुलना में int में बदलने के लिए खाली स्ट्रिंग का उपयोग करने के बारे में भी बता सकते हैं? उदा) "" + int i = "i"? कौन सा सबसे अच्छा है?
कनागवेलु सुगम कुमार

1
स्ट्रिंग के रूप में इंट को प्रारूपित करने के लिए आपको "+" का उपयोग नहीं करना चाहिए। वहाँ सिर के ऊपर मौजूद नहीं है, लेकिन आम तौर पर क्योंकि यह सुरुचिपूर्ण नहीं है। इसके बजाय का उपयोग करने का String.valueOf(int)है, तो आप उपयोग कर सकते हैं String.format("%d",i);और अधिक पढ़ने के कृपया इस वेब साइट पर जाएँ docs.oracle.com/javase/6/docs/api/java/util/Formatter.html
डेमियन Leszczynski - Vash

काश ऑटोबॉक्सिंग चतुर था और सिर्फ संकलन या कुछ और पर रूपांतरण जोड़ा।
रोब ग्रांट

1
@RobertGrant ऑटोबॉक्सिंग यहाँ मामला नहीं है। लेकिन अपनी चिंताओं का जवाब देने के लिए, यह चतुर है क्योंकि आप ऐसा कर सकते हैं int i = new Integer("1");और इसके विपरीत।
डेमियन लेस्ज़्ज़स्की - वश

52

एक बहुत बड़ा अंतर यह है कि यदि आप toString()एक अशक्त वस्तु में आह्वान करते हैं , तो आपको थोड़ी देर के लिए मिलेगा NullPointerException, String.valueOf()आप का उपयोग करना संभव नहीं है।


46
सवाल है Integer.toString(int i), एक staticविधि के बारे में । कोई nullवस्तु संभव नहीं हैं।
पेट्र जेनेक

14
Integer i = null; i.toString(); // Null pointer exception!! String.valueOf(i); // No exception
मनीष_एस

10
@Manis कुमार: अपने उदाहरण सक्रिय नहीं होगा String.valueOf(int i)विधि लेकिन String.valueOf(Object obj)। किसी भी तरह, सवाल आदिम intमूल्यों के बारे में है, जहां कोई संभावना नहीं है null
हेलिनोन

1
@manish_s इस उदाहरण से बहुत स्पष्ट था कि कोई भी व्यक्ति ऑब्जेक्ट प्रकार के बारे में बात नहीं कर रहा है। हम केवल प्राथमिकताओं के बारे में बात कर रहे हैं।
डैनियल ओचोआ

2
@manish_s: ओपी नहीं कहा Integer.toString()लेकिन Integer.toString(int i)। यह एक स्थिर विधि है ( docs.oracle.com/javase/7/docs/api/java/lang/… )।
3

13

स्ट्रिंग क्लास सभी आदिम प्रकारों और ऑब्जेक्ट प्रकार के लिए valueOf तरीके प्रदान करता है इसलिए मुझे लगता है कि वे सुविधा विधियां हैं जो सभी को एक वर्ग के माध्यम से एक्सेस किया जा सकता है।

एनबी प्रोफाइलिंग परिणाम

औसत intToString = 5368ms, औसत stringValueOf = 5689ms (100,000,000 ऑपरेशन के लिए)

public class StringIntTest {


    public static long intToString () {
        long startTime = System.currentTimeMillis();
        for (int i = 0; i < 100000000; i++) {
            String j = Integer.toString(i);
        }
        long finishTime = System.currentTimeMillis();

        return finishTime - startTime;
    }

    public static long stringValueOf () {

        long startTime = System.currentTimeMillis();
        for (int i = 0; i < 100000000; i++) {
            String j = String.valueOf(i);
        }
        long finishTime = System.currentTimeMillis();

        return finishTime - startTime;
    }

    public static void main(String[] args) {
        long intToStringElapsed = 0;
        long stringValueOfElapsed = 0;
        for (int i = 0; i < 10; i++) {
            intToStringElapsed += intToString();
            stringValueOfElapsed+= stringValueOf();
        }
        System.out.println("Average intToString = "+ (intToStringElapsed /10));
        System.out.println("Average stringValueOf = " +(stringValueOfElapsed / 10));
    }
}

7
आपके प्रोफाइलिंग की वास्तव में "वार्म-अप" अवधि होनी चाहिए, अन्यथा परिणाम जेआईटी द्वारा चीजों के साथ छेड़छाड़ किया जा सकता है। उस ने कहा, 10 ^ 8 संचालन पर एक 300ms अंतर इतना छोटा है कि पूरी तरह से नगण्य है।
कैमरून स्किनर

1
@Kingo मुझे नहीं लगता कि आपका परीक्षण मामला सही है। क्योंकि आप मान प्रदान कर रहे हैं, String jलेकिन कभी उपयोग नहीं करते। अंतर्निहित कंपाइलर ने इसे अनुकूलित किया हो सकता है। अलग-अलग विधि में जे ऑब्जेक्ट को पास करना और कुछ डमी ऑपरेशन करना बेहतर है।
राकेश

1
आपको वास्तव में इस तरह से घर के माइक्रो बेंचमार्क नहीं लिखना चाहिए। यदि आप JMH का उपयोग करते हैं । यह वार्मअप, समय की माप का ध्यान रखेगा, कई इंडिपेंडेंट कोशिश करता है (जावा कांटे!) और कोड को छोटा बनाता है, यह ऐसा दिखता है (विभिन्न तरीकों और मूल्यों के लिए परिणाम। - रनटाइम 7 मिनट): gist.github.com/ecky_ 399136f4fd59c1d110c1 (स्पॉइलर: "" + n जीता)।
Eckes

5
धन्यवाद दोस्त, लेकिन मेरा जवाब 5 साल पहले था! जेएमएच केवल 2013 में जारी किया गया था: पी
किंगो

9

जावा स्रोतों से:

/**
 * Returns the string representation of the {@code int} argument.
 * <p>
 * The representation is exactly the one returned by the
 * {@code Integer.toString} method of one argument.
 *
 * @param   i   an {@code int}.
 * @return  a string representation of the {@code int} argument.
 * @see     java.lang.Integer#toString(int, int)
 */
public static String valueOf(int i) {
    return Integer.toString(i);
}

तो वे वास्तव में एक ही परिणाम देते हैं और एक वास्तव में दूसरे को बुलाता है। यदि आप बाद में प्रकार बदल सकते हैं, तो String.valueOf अधिक लचीला है।


8

यदि आप Stringकक्षा के लिए स्रोत कोड को देखते हैं , तो यह वास्तव में कॉल करने Integer.toString()पर आपको कॉल करता है valueOf()

कहा जा रहा है, Integer.toString()अगर विधि कॉल को संकलन समय (जो वे शायद कर रहे हैं) पर अनुकूलित नहीं किया जाता है तो यह तेज हो सकता है।


हां और "" + n और भी तेज है। देखें gist.github.com/ecki/399136f4fd59c1d110c1
Eckes

3

आपके द्वारा देखा जाने वाला कार्यान्वयन String.valueOf()API में निर्दिष्ट अनुबंध को पूरा करने का सबसे सरल तरीका है: "प्रतिनिधित्व ठीक Integer.toString()एक तर्क की विधि द्वारा लौटाया गया है।"


2

ओपी के सवाल का जवाब देने के लिए, यह अन्य कॉल करने के लिए बस एक सहायक आवरण है, और स्टाइल पसंद करने के लिए नीचे आता है और वह यह है। मुझे लगता है कि यहां बहुत गलत जानकारी है और एक जावा डेवलपर सबसे अच्छी बात यह कर सकता है कि प्रत्येक विधि के कार्यान्वयन को देखो, यह किसी भी आईडीई में एक या दो क्लिक दूर है। आप स्पष्ट रूप से देखेंगे कि String.valueOf(int)बस Integer.toString(int)आपके लिए कॉल कर रहा है।

इसलिए, बिल्कुल शून्य अंतर है, जिसमें वे दोनों एक चार बफर बनाते हैं, संख्या में अंकों के माध्यम से चलते हैं, फिर कॉपी करें कि एक नए स्ट्रिंग में और इसे वापस लौटाएं (इसलिए प्रत्येक एक स्ट्रिंग ऑब्जेक्ट बना रहे हैं)। केवल अंतर एक अतिरिक्त कॉल है, जो कंपाइलर किसी भी कॉल को समाप्त करता है।

इसलिए यह मायने रखता है कि जिसे आप कॉल करते हैं, शायद कोड-संगति के अलावा। Nulls के बारे में टिप्पणी के रूप में, यह एक आदिम लेता है, इसलिए यह शून्य नहीं हो सकता है! यदि आप आरंभिक को पास नहीं करते हैं तो आपको एक संकलन-समय त्रुटि मिलेगी। इसलिए इसमें कोई अंतर नहीं है कि वे इस मामले में गैर-मौजूद हैं, इसलिए यह नल को कैसे संभालता है।


क्या आप अपने पाठ को कुछ खंडों में अलग कर सकते हैं। इसे पढ़ना बहुत कठिन है।
मैग्निलेक्स

इस ओपी में बहुत सी गलत जानकारी है। आपकी पोस्ट मेरे लिए सबसे अच्छा जवाब है! धन्यवाद
aksappy

1

आपको इस अतिरिक्त कॉल के बारे में चिंता नहीं करनी चाहिए जिससे आपको दक्षता की समस्या हो। यदि कोई लागत है, तो यह न्यूनतम होगा, और चीजों की बड़ी तस्वीर में नगण्य होना चाहिए।

शायद यही कारण है कि दोनों मौजूद हैं पठनीयता की पेशकश करने के लिए। कई प्रकारों में परिवर्तित होने के संदर्भ में String, तब विभिन्न कॉल विभिन्न कॉलों की String.valueOf(SomeType)तुलना में अधिक पठनीय हो सकती SomeType.toStringहैं।


1
दरअसल, इस तरह के एक-लाइन कॉल बहुत जल्दी इनबिल्ट हो जाते हैं।
टासोस बैसकोस

यहां तक ​​कि एक लूप में 1 000 000 समय String.valueof () ??
मैनुएल सेल्वा

@ मैनुअल: क्या आपने इसे प्रोफाइल किया था? क्या आपने पहचाना है कि यहाँ आपकी प्रदर्शन समस्या है? क्या आप सुनिश्चित हैं कि आप समय से पहले अनुकूलन नहीं कर रहे हैं? @ टैसोस: हाँ, यह भी बहुत संभावना है, लेकिन किसी भी तरह से मैं इसके बारे में चिंता नहीं करूंगा जब तक कि प्रोफाइलिंग यह नहीं कहता कि इस विशेष कॉल के साथ कोई समस्या है।
पॉलीजेन लुब्रिकेंट्स

दरअसल, मैनुअल, मैं एक बार या एक या दो बार जाने की तुलना में अधिक बार इनबिल्ट होने के लिए एक लूप की उम्मीद करूंगा। फिर भी, यह समय का एक छोटा सा हिस्सा होने जा रहा है, चाहे कितनी बार यह लूप हो।
corsiKa

नहीं, लेकिन मुझे यकीन है कि मेरे ऐप में यहां कोई बोतल गर्दन नहीं है। मैं सिर्फ यह पूछ रहा हूं क्योंकि मैं यहां किसी भी पठनीयता की चिंता को नहीं देख सकता हूं और इस तरह मुझे लगता है कि मुझे अधिक इष्टतम कोड का उपयोग करना होगा भले ही लाभ 0. है क्या आप सहमत नहीं हैं?
मैनुएल सेल्वा

1

मेरा ओपनियन वैल्यूऑफ़ () हमेशा कहा जाता है (रिप्रेजेंटेशन के लिए टोस्टिंग) और इसलिए प्राइमेट टाइप वैल्यू का प्रेजेंटेशन सामान्यीकृत है। और जावा डिफ़ॉल्ट रूप से डेटा प्रकार का समर्थन नहीं करता है, लेकिन यह ऑब्जेक्ट के साथ अपने काम को परिभाषित करता है और क्लालस में अपनी बनाई सभी चीजों को क्लास करता है। object .here Integer.toString (int i) एक सीमा बनाता है जो केवल पूर्णांक के लिए रूपांतरण करता है।


1

Integer.toString (5) और String.valueOf (5) के बीच कोई अंतर नहीं है;

क्योंकि String.valueOf रिटर्न:

public static String valueOf(int i) {
    return Integer.toString(i);
}
public static String valueOf(float f) {
    return Float.toString(f);
}

आदि..


0

विधि का उपयोग करते हुए, String.valueOf () आपको डेटा के बारे में चिंता करने की ज़रूरत नहीं है (चाहे वह इंट, लॉन्ग, चार, चार [, बूलियन, ऑब्जेक्ट) है, आप बस कॉल कर सकते हैं:

  • स्थिर स्ट्रिंग valueOf ()

केवल सिंटैक्स String.valueOf () का उपयोग करके आप जो कुछ भी पैरामीटर के रूप में पास कर सकते हैं वह स्ट्रिंग में बदल जाता है और वापस आ जाता है ..

अन्यथा, यदि आप Integer.toString (), Float.toString () आदि (यानी SomeType.toString ()) का उपयोग करते हैं तो आपको पैरामीटर के डेटाटाइप को जांचना होगा जिसे आप स्ट्रिंग में बदलना चाहते हैं। तो, ऐसे रूपांतरणों के लिए String.valueOf () का उपयोग करना बेहतर है।

यदि आपके पास ऑब्जेक्ट क्लास की एक सरणी है जिसमें विभिन्न मान हैं जैसे कि इंटीगर, चार, फ्लोट आदि। तब String.valueOf () विधि का उपयोग करके आप ऐसे सरणी के तत्वों को स्ट्रिंग रूप में आसानी से परिवर्तित कर सकते हैं। इसके विपरीत, यदि आप SomeType.toString () का उपयोग करना चाहते हैं, तो सबसे पहले आपको उनके डेटाटाइप कक्षाओं (शायद "इंस्टोफ़" ऑपरेटर का उपयोग करके) के बारे में जानना होगा और उसके बाद ही आप टाइपकास्ट के लिए आगे बढ़ सकते हैं।

String.valueOf () विधि को बुलाया जाता है, जो उस पैरामीटर से मेल खाती है, जो पास हो गया है (चाहे उसका इंटीजर, चार, फ्लोट आदि) और विधि ओवरलोडिंग कॉल का उपयोग करके कि "valueOf ()" विधि जिसका पैरामीटर से मिलान हो जाता है, और फिर इस विधि के अंदर उनकी विधि है इसी "toString ()" विधि के लिए एक सीधा कॉल ..

इसलिए, हम देख सकते हैं कि कैसे डेटाटाइप की जाँच का ओवरहेड और फिर इसी "toString ()" विधि को हटा दिया जाता है। आमतौर पर हमें String.valueOf () विधि को कॉल करने की आवश्यकता होती है, न कि हम जिसे स्ट्रिंग में कनवर्ट करना चाहते हैं, उसकी देखभाल करना।

निष्कर्ष: String.valueOf () विधि में एक और कॉल की लागत पर इसका महत्व है।


-3

तार()

  1. ऑब्जेक्ट क्लास में मौजूद है, आम तौर पर व्युत्पन्न वर्ग में ओवरराइड किया जाता है
  2. टाइपस्ट्रीम () विधि को कॉल करने के लिए उपयुक्त वर्ग के लिए टाइपकास्ट आवश्यक है।

का मूल्य()

  1. स्ट्रिंग क्लास में मौजूद ओवरलोडेड स्टैटिक विधि।
  2. आदिम प्रकार के साथ ही वस्तु प्रकार को संभालता है।

    Integer a = null;
    System.out.println(Integer.toString()) ; NUll pointer exception
    System.out.println(String.valueOf() ; give NULL as value

इस लिंक को बहुत अच्छे से देखें। http://code4reference.com/2013/06/which-one-is-better-valueof-or-tostring/

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.