String.valueOf () बनाम Object.toString ()


132

जावा में, String.valueOf(Object)और Object.toString()क्या कोई अंतर है ? क्या इनके लिए कोई विशिष्ट कोड कन्वेंशन है?


10
आदिम प्रकारों में "toString" नहीं है .. इसलिए String.valueOfइसका उपयोग किया जाता है। उन वस्तुओं के लिए जो स्ट्रीडिंग को ओवरराइड करते हैं, मुझे लगता है कि इसके बजाय String.valueOf कॉल कर सकते हैं। हालांकि उस हिस्से के बारे में निश्चित नहीं है।
ब्रैंडन

@Brandon आप सही हैं, यह वास्तव में ऐसा करता है, सिवाय इसके कि यह nullपहले के लिए जाँच करता है ।
azurefrog

यहाँ पहली टिप्पणी मुझे लगता है कि यह सही होने पर सबसे अधिक समझ में आता है। आपको कुछ स्थितियों में String.valueOf का उपयोग करना चाहिए जहां लक्ष्य एक आदिम प्रकार है।
डनाटो

जवाबों:


177

जावा प्रलेखन के अनुसार , String.valueOf()रिटर्न:

यदि तर्क है null, तो एक स्ट्रिंग के बराबर "null"; अन्यथा, का मान obj.toString()लौटाया जाता है।

तो वास्तव में एक अतिरिक्त विधि मंगलाचरण को छोड़कर कोई अंतर नहीं होना चाहिए।

इसके अलावा, Object#toStringउदाहरण के लिए, यदि उदाहरण है null, तो एक NullPointerExceptionको फेंक दिया जाएगा, इसलिए, यकीनन, यह कम सुरक्षित है

public static void main(String args[]) {  
    String str = null;
    System.out.println(String.valueOf(str));  // This will print a String equal to "null"        
    System.out.println(str.toString()); // This will throw a NullPointerException
} 

6
यह सबसे अच्छा जवाब है। कोड को नहीं, बल्कि javadocs पर पढ़ें और भरोसा करें। (जावा के विभिन्न संस्करणों / रिलीज के लिए कोड सैद्धांतिक रूप से भिन्न हो सकता है।)
स्टीफन C

7
@ब्रांडन - गलत। यह केवल बदलने की जरूरत है अगर व्यवहार एक तरह से बदल जाता है जो कि javadoc को अमान्य करता है। 1) इस विधि के लिए होने की संभावना शून्य हैं। वे एक ऐसा बदलाव नहीं करेंगे जिससे कल्पना में बदलाव आए और अगर उन्होंने ऐसा किया तो वे कल्पना को बदल देंगे । 2) यह मेरी सलाह को अमान्य नहीं करता है। यदि आप जावाडॉक पढ़ते हैं, तो आप देखेंगे कि दस्तावेज व्यवहार बदल गया है!
स्टीफन C

2
क्या वह विधि जो अपवाद को फेंकती है वह अधिक सुरक्षित नहीं होगी? आमतौर पर, जब आपका कोड NullPointerException फेंकता है, तो यह एक अच्छी बात है। यह क्षण में डेवलपर को अच्छा नहीं लग सकता है ("aww, नहीं, अब मुझे वापस जाने और अपना कोड ठीक करने की आवश्यकता है"), लेकिन चूंकि त्रुटि डाली गई थी, तो आपको पता चला कि आपको कुछ ठीक करने की आवश्यकता है। दूसरे तरीके से छोड़ दें, आप सीधे उपयोगकर्ता को "अशक्त" उजागर कर रहे हैं और जब तक आप एक के लिए स्पष्ट रूप से जांच नहीं करते हैं, तब तक आपको त्रुटि की सूचना नहीं मिलती है, जो मुझे कम सुरक्षित लगता है।
टिम एम।

1
बस स्पष्ट होने के लिए, आप वास्तव में कॉल नहीं कर सकते String.valueOf(null), यह एक एनपीई है। यह केवल उन वस्तुओं के लिए काम करता है जो अशक्त हैं।
नूमेनन

1
वह स्पष्टीकरण नहीं है। String.valueOf(null)वास्तव में करने के लिए हल करता है valueOf(char[])अधिभार। यह इसलिए है क्योंकि char[]की तुलना में अधिक विशिष्ट प्रकार है Object
स्टीफन सी

17

String.valueOf (ऑब्जेक्ट) और Object.toString () के बीच अंतर हैं:

1) यदि स्ट्रिंग अशक्त है,

String.valueOf(Object)वापस आ जाएगा null, जबकि Object::toString()एक शून्य सूचक अपवाद फेंक देगा।

public static void main(String args[]){  
    String str = null;

    System.out.println(String.valueOf(str));  // it will print null        
    System.out.println(str.toString()); // it will throw NullPointerException        
}  

2) हस्ताक्षर:

valueOf () स्ट्रिंग वर्ग की विधि स्थिर है। जबकि स्ट्रिंग () स्ट्रिंग वर्ग की विधि गैर स्थिर है।

स्ट्रिंग के मान () विधि का हस्ताक्षर या वाक्य-विन्यास नीचे दिया गया है:

public static String valueOf(boolean b)  
public static String valueOf(char c)  
public static String valueOf(char[] c)  
public static String valueOf(int i)  
public static String valueOf(long l)  
public static String valueOf(float f)  
public static String valueOf(double d)  
public static String valueOf(Object o)

स्ट्रिंग toString()विधि का हस्ताक्षर या वाक्य-विन्यास नीचे दिया गया है:

public String toString()

13

जावा में, क्या String.valueOf (ऑब्जेक्ट) और Object.toString () के बीच कोई अंतर है?

हाँ। (और तो और अगर आप ओवरलोडिंग पर विचार करते हैं!)

जैसा कि जवादोक बताते हैं, विधि String.valueOf((Object) null)द्वारा एक विशेष मामले के रूप में माना जाएगा valueOfऔर मूल्य "null"वापस लौटाया जाता है। इसके विपरीत, null.toString()बस आपको एक एनपीई देगा।

ओवरलोडिंग

ऐसा लगता है कि String.valueOf(null)(अंतर ध्यान दें!) करता है एक एनपीई दे ... जावाडोक के बावजूद। स्पष्टीकरण अस्पष्ट है:

  1. ओवरलोड की एक संख्या है String.valueOf, लेकिन दो हैं जो यहां प्रासंगिक हैं: String.valueOf(Object)और String.valueOf(char[])

  2. अभिव्यक्ति में String.valueOf(null), दोनों ओवरलोड लागू होते हैं , क्योंकि nullअसाइनमेंट किसी भी संदर्भ प्रकार के साथ संगत है।

  3. जब दो या अधिक लागू ओवरलोड होते हैं, तो जेएलएस कहता है कि सबसे विशिष्ट तर्क प्रकार के लिए अधिभार चुना गया है।

  4. चूंकि , इसका char[]उप-प्रकार है Object, इसलिए यह अधिक विशिष्ट है

  5. इसलिए String.valueOf(char[])अधिभार कहा जाता है।

  6. String.valueOf(char[])NPE फेंकता है यदि इसका तर्क एक अशक्त सरणी है। इसके विपरीत String.valueOf(Object), यह nullएक विशेष मामले के रूप में व्यवहार नहीं करता है ।

(आप javap -cएक String.valueOf(null)कॉल करने वाली विधि के कोड की जांच करके इसकी पुष्टि कर सकते हैं । कॉल के लिए उपयोग किए जाने वाले अधिभार का निरीक्षण करें।)

एक और उदाहरण valueOf(char[])ओवरलोड में अंतर को और भी स्पष्ट रूप से दिखाता है :

char[] abc = new char[]('a', 'b', 'c');
System.out.println(String.valueOf(abc));  // prints "abc"
System.out.println(abc.toString());       // prints "[C@...."

क्या इनके लिए कोई विशिष्ट कोड कन्वेंशन है?

नहीं।

जिस संदर्भ में आप इसका उपयोग कर रहे हैं, उसकी आवश्यकताओं के लिए उपयोग करना सबसे उपयुक्त है। (आप के लिए काम करने के लिए स्वरूपण की आवश्यकता है null?)

नोट: यह एक कोड सम्मेलन नहीं है। यह सिर्फ सामान्य ज्ञान प्रोग्रामिंग है। यह अधिक महत्वपूर्ण है कि आपका कोड कुछ शैलीगत सम्मेलन या "सर्वोत्तम अभ्यास" हठधर्मिता का पालन करने की तुलना में सही है।


निजी राय:

कुछ डेवलपर्स नल के खिलाफ "बचाव" करने की खराब आदत (आईएमओ) का अधिग्रहण करते हैं। तो आप नल के लिए बहुत सारे परीक्षण देखते हैं, और विशेष मामलों के रूप में नल का इलाज करते हैं। लगता है कि एनपीई को होने से रोका जाएगा।

मुझे लगता है कि यह एक बुरा विचार है। विशेष रूप से, मुझे लगता है कि यह एक बुरा विचार है यदि आप क्या करते हैं जब आपको null"अच्छा बनाने" की कोशिश करने के लिए एक है ... एक विचार के बिना क्यों एक थाnull

सामान्य तौर पर, nullपहले स्थान पर होने से बचने के लिए बेहतर है ... जब तक कि nullआपके आवेदन या एपीआई डिजाइन में बहुत विशिष्ट अर्थ न हो। इसलिए, बहुत सारे रक्षात्मक कोडिंग के साथ एनपीई से बचने के बजाय, एनपीई को होने देना बेहतर है, और फिर नीचे ट्रैक करें और अप्रत्याशित के स्रोत को ठीक करेंnull जिसने एनपीई को ट्रिगर किया।

तो यह यहाँ कैसे लागू होता है?

ठीक है, अगर आप इसके बारे में सोचते हैं, तो "अच्छा बनाने" का एक तरीका String.valueOf(obj) हो सकता है। जिससे बचना है। यदि यह संदर्भ में objहोना अप्रत्याशित nullहै, तो इसका उपयोग करना बेहतर है obj.toString()


5

अधिकांश को पहले से ही अन्य उत्तरों द्वारा उल्लेख किया गया है, लेकिन मैं इसे पूर्णता के लिए जोड़ता हूं:

  1. प्रिमिटिव में ऐसा नहीं है .toString()क्योंकि वे Object-क्लास का कार्यान्वयन नहीं हैं , इसलिए केवल String.valueOfइसका उपयोग किया जा सकता है।
  2. String.valueOfकिसी दिए गए ऑब्जेक्ट nullको स्ट्रिंग में बदल देगा "null", जबकि .toString()एक फेंक देगा NullPointerException
  3. कंपाइलर String.valueOfडिफ़ॉल्ट रूप से उपयोग करेगा जब कुछ पसंद String s = "" + (...);किया जाता है। जिसके कारण Object t = null; String s = "" + t;स्ट्रिंग में परिणाम होगा "null", और एनपीई में नहीं। संपादित करें: वास्तव में, यह उपयोग करेगा StringBuilder.append, नहीं String.valueOf। इसलिए मैंने यहां जो कहा उसे अनदेखा कर दें।

उन लोगों के अलावा, यहां वास्तव में एक उपयोग मामला है जहां String.valueOfऔर .toString()अलग-अलग परिणाम हैं:

मान लीजिए कि हमारे पास एक सामान्य तरीका है:

public static <T> T test(){
  String str = "test";
  return (T) str;
}

और हम इसे Integerइस तरह से टाइप करेंगे :Main.<Integer>test()

जब हम String.valueOfइसके साथ एक स्ट्रिंग बनाते हैं तो यह ठीक काम करता है:

String s1 = String.valueOf(Main.<Integer>test());
System.out.println(s1);

यह आउटपुट करेगा test STDOUT ।

एक साथ .toString()तथापि, यह काम नहीं करेगा:

String s2 = (Main.<Integer>test()).toString();
System.out.println(s2);

इसके परिणामस्वरूप निम्न त्रुटि होगी:

java.lang.ClassCastException: वर्ग java.lang.Stringको कक्षा में नहीं रखा जा सकता हैjava.lang.Integer

इसे ऑनलाइन आज़माएं।

क्यों के रूप में, मैं इस अलग सवाल और इसके जवाब का उल्लेख कर सकते हैं । हालांकि संक्षेप में:

  • का उपयोग करते समय .toString()यह पहली संकलन और वस्तु है, जहां के लिए कलाकारों का मूल्यांकन करेंगे T(जो एक है Stringकरने के लिए Integerइस मामले में डाली) में परिणाम होगा ClassCastException
  • का उपयोग करते समय String.valueOfयह सामान्य देखेंगे Tके रूप में Objectसंकलन के दौरान और यहां तक कि यह एक होने के बारे में परवाह नहीं करता Integer। इसलिए यह एक डाली जाएगा Objectकरने के लिए Object(जो संकलक सिर्फ ध्यान नहीं देता है)। तब यह उपयोग करेगा String.valueOf(Object), जिसके परिणामस्वरूप एक Stringउम्मीद थी। इसलिए भले ही आंतरिक रूप से पैरामीटर पर String.valueOf(Object)होगा .toString(), हमने पहले ही कलाकारों को छोड़ दिया है और इसका इलाज एक की तरह किया है Object, इसलिए हमने इसके ClassCastExceptionउपयोग से होने वाले नुकसान से बचा है .toString()

बस सोचा कि यह String.valueOfऔर .toString()यहाँ के बीच इस अतिरिक्त अंतर का उल्लेख करने लायक था ।


पिछली बार मैंने इस बारे में ध्यान दिया था, जो कि JDK 1.2 के आसपास रहा होगा, ("" + x)संकलित किया गया था String.valueOf(x), लेकिन कुछ अधिक जटिल का उपयोग किया गया a StringBuffer(हमारे पास StringBuilderतब नहीं था )।
नील

4

String.valueOf(Object)और Object.toString()सचमुच एक ही चीज है।

यदि आप String.valueOf (ऑब्जेक्ट) के कार्यान्वयन पर एक नज़र डालते हैं , तो आप देखेंगे कि String.valueOf(Object)मूल रूप toString()से उचित ऑब्जेक्ट का केवल एक शून्य-सुरक्षित आह्वान है :

Returns the string representation of the Object argument.

Parameters:
    obj an Object.
Returns:
    if the argument is null, then a string equal to "null"; 
    otherwise, the value of obj.toString() is returned.
See also:
    Object.toString()

public static String valueOf(Object obj) {
    return (obj == null) ? "null" : obj.toString();
}

सच नहीं है, दोनों valueOf का उपयोग करें और एक char array पर toString करें और अपनी आंखों को दावत दें।
आर्टानिस

3

सबसे महत्वपूर्ण अंतर यह है कि वे अशक्त स्ट्रिंग संदर्भों को संभालते हैं।

String str = null;
System.out.println("String.valueOf gives : " + String.valueOf(str));//Prints null
System.out.println("String.toString gives : " + str.toString());//This would throw a NullPointerExeption

1

जब तर्क है null, String.valueOfरिटर्न "null", लेकिन Object.toStringफेंकता है NullPointerException, यह एकमात्र अंतर है।


0

दो तरीकों के बीच एक और बड़ा अंतर है जब हम जिस वस्तु को परिवर्तित कर रहे हैं वह एक सरणी है।

जब आप Object.toString () का उपयोग करके एक ऐरे को रूपांतरित करते हैं, तो आपको किसी प्रकार का कचरा मान (@ इसके बाद हैशकोड की सरणी) मिलेगा।

एक मानव-पठनीय toString () प्राप्त करने के लिए, आपको String.valueOf (char []) का उपयोग करना होगा; plz ध्यान दें कि यह विधि केवल Array of type char के लिए काम करती है। मैं Arrays.toString (ऑब्जेक्ट []) को स्ट्रिंग में सरणियों को परिवर्तित करने के लिए उपयोग करने की सलाह दूंगा।

दूसरा अंतर तब होता है जब ऑब्जेक्ट अशक्त होता है, ValueOf () एक स्ट्रिंग "अशक्त" देता है, जबकि स्ट्रींग () अशक्त सूचक अपवाद लौटाएगा।


हाय @ यह किसी भी प्रकार की एक सरणी के लिए सही है, हालाँकि यदि आप Arrays.toString (ऑब्जेक्ट []) का उपयोग कर रहे हैं, तो आप किसी भी प्रकार की एक सरणी को स्ट्रिंग में परिवर्तित कर सकते हैं।
चिन्तन ठक्कर १२'१17

Hi @Tom Object.toString () किसी भी प्रकार की एक सरणी के लिए कचरा मूल्य वापस करना सही है, आप सही कह रहे हैं कि स्ट्रिंग प्रकार की सरणी के लिए केवल String.valueOf (Array) सही स्ट्रिंग देगा। मुझे इसका उल्लेख करना चाहिए था, धन्यवाद, मैं इसे संपादित करूंगा।
चिंतन ठक्कर

1
यह एक कचरा मूल्य नहीं है, यह क्लासनाम और हैशकोड ( जावाडॉक ) है।
टॉम

-1

मैं बिल्कुल नहीं कह सकता कि अंतर क्या है लेकिन बाइट स्तर पर काम करते समय एक अंतर प्रतीत होता है। निम्न एन्क्रिप्शन परिदृश्य में ऑब्जेक्ट।

private static char[] base64Encode(byte[] bytes) 
{   
    return Base64.encode(bytes);
}

private static String encrypt(String encrypt_this) throws GeneralSecurityException, UnsupportedEncodingException 
{
    SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBEWithMD5AndDES");
    SecretKey key = keyFactory.generateSecret(new PBEKeySpec(PASSWORD));
    Cipher pbeCipher = Cipher.getInstance("PBEWithMD5AndDES");
    pbeCipher.init(Cipher.ENCRYPT_MODE, key, new PBEParameterSpec(SALT, 20));

     //THIS FAILED when attempting to decrypt the password
    //return base64Encode(pbeCipher.doFinal(encrypt_this.getBytes("UTF-8"))).toString(); 

    //THIS WORKED
    return String.valueOf(base64Encode(pbeCipher.doFinal(encrypt_this.getBytes("UTF-8"))));
}//end of encrypt()

क्यों फेल हुए? समस्या क्या है?
यौषा अलबायो

स्पष्टीकरण यह है कि आप वास्तव में valueOf(char[])बजाय बुला रहे हैं valueOf(Object)। के व्यवहार में valueOf(char[])काफी भिन्नता है char[].toString()। लेकिन किसी भी तरह से, यह जवाब एप्रोपोस नहीं है क्योंकि आप जिस प्रश्न के बारे में पूछते हैं, उसे एक अलग अधिभार कह रहे हैं।
स्टीफन सी

-2

नीचे java.lang.String.valueOf के लिए कार्यान्वयन को दिखाता है जैसा कि jdk8u25 के लिए स्रोत में वर्णित है। इसलिए मेरी टिप्पणी के अनुसार, कोई अंतर नहीं है। इसे "Object.toString" कहते हैं। आदिम प्रकारों के लिए, यह इसे अपने ऑब्जेक्ट रूप में लपेटता है और इस पर "स्ट्रींग" कहता है।

निचे देखो:

/*
 * Copyright (c) 1994, 2013, Oracle and/or its affiliates. All rights reserved.
 * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 */


    public static String valueOf(Object obj) {
        return (obj == null) ? "null" : obj.toString();
    }

    public static String valueOf(char data[]) {
        return new String(data);
    }

    public static String valueOf(char data[], int offset, int count) {
        return new String(data, offset, count);
    }

    public static String copyValueOf(char data[], int offset, int count) {
        return new String(data, offset, count);
    }

    public static String copyValueOf(char data[]) {
        return new String(data);
    }

    public static String valueOf(boolean b) {
        return b ? "true" : "false";
    }

    public static String valueOf(char c) {
        char data[] = {c};
        return new String(data, true);
    }

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

    public static String valueOf(long l) {
        return Long.toString(l);
    }

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

    public static String valueOf(double d) {
        return Double.toString(d);
    }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.