जावा में, String.valueOf(Object)और Object.toString()क्या कोई अंतर है ? क्या इनके लिए कोई विशिष्ट कोड कन्वेंशन है?
nullपहले के लिए जाँच करता है ।
जावा में, String.valueOf(Object)और Object.toString()क्या कोई अंतर है ? क्या इनके लिए कोई विशिष्ट कोड कन्वेंशन है?
nullपहले के लिए जाँच करता है ।
जवाबों:
जावा प्रलेखन के अनुसार , 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
}
String.valueOf(null), यह एक एनपीई है। यह केवल उन वस्तुओं के लिए काम करता है जो अशक्त हैं।
String.valueOf(null)वास्तव में करने के लिए हल करता है valueOf(char[])अधिभार। यह इसलिए है क्योंकि char[]की तुलना में अधिक विशिष्ट प्रकार है Object।
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()
जावा में, क्या String.valueOf (ऑब्जेक्ट) और Object.toString () के बीच कोई अंतर है?
हाँ। (और तो और अगर आप ओवरलोडिंग पर विचार करते हैं!)
जैसा कि जवादोक बताते हैं, विधि String.valueOf((Object) null)द्वारा एक विशेष मामले के रूप में माना जाएगा valueOfऔर मूल्य "null"वापस लौटाया जाता है। इसके विपरीत, null.toString()बस आपको एक एनपीई देगा।
ऐसा लगता है कि String.valueOf(null)(अंतर ध्यान दें!) करता है एक एनपीई दे ... जावाडोक के बावजूद। स्पष्टीकरण अस्पष्ट है:
ओवरलोड की एक संख्या है String.valueOf, लेकिन दो हैं जो यहां प्रासंगिक हैं: String.valueOf(Object)और String.valueOf(char[])।
अभिव्यक्ति में String.valueOf(null), दोनों ओवरलोड लागू होते हैं , क्योंकि nullअसाइनमेंट किसी भी संदर्भ प्रकार के साथ संगत है।
जब दो या अधिक लागू ओवरलोड होते हैं, तो जेएलएस कहता है कि सबसे विशिष्ट तर्क प्रकार के लिए अधिभार चुना गया है।
चूंकि , इसका char[]उप-प्रकार है Object, इसलिए यह अधिक विशिष्ट है ।
इसलिए String.valueOf(char[])अधिभार कहा जाता है।
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()।
अधिकांश को पहले से ही अन्य उत्तरों द्वारा उल्लेख किया गया है, लेकिन मैं इसे पूर्णता के लिए जोड़ता हूं:
.toString()क्योंकि वे Object-क्लास का कार्यान्वयन नहीं हैं , इसलिए केवल String.valueOfइसका उपयोग किया जा सकता है।String.valueOfकिसी दिए गए ऑब्जेक्ट nullको स्ट्रिंग में बदल देगा "null", जबकि .toString()एक फेंक देगा NullPointerException।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()यहाँ के बीच इस अतिरिक्त अंतर का उल्लेख करने लायक था ।
("" + x)संकलित किया गया था String.valueOf(x), लेकिन कुछ अधिक जटिल का उपयोग किया गया a StringBuffer(हमारे पास StringBuilderतब नहीं था )।
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();
}
सबसे महत्वपूर्ण अंतर यह है कि वे अशक्त स्ट्रिंग संदर्भों को संभालते हैं।
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
दो तरीकों के बीच एक और बड़ा अंतर है जब हम जिस वस्तु को परिवर्तित कर रहे हैं वह एक सरणी है।
जब आप Object.toString () का उपयोग करके एक ऐरे को रूपांतरित करते हैं, तो आपको किसी प्रकार का कचरा मान (@ इसके बाद हैशकोड की सरणी) मिलेगा।
एक मानव-पठनीय toString () प्राप्त करने के लिए, आपको String.valueOf (char []) का उपयोग करना होगा; plz ध्यान दें कि यह विधि केवल Array of type char के लिए काम करती है। मैं Arrays.toString (ऑब्जेक्ट []) को स्ट्रिंग में सरणियों को परिवर्तित करने के लिए उपयोग करने की सलाह दूंगा।
दूसरा अंतर तब होता है जब ऑब्जेक्ट अशक्त होता है, ValueOf () एक स्ट्रिंग "अशक्त" देता है, जबकि स्ट्रींग () अशक्त सूचक अपवाद लौटाएगा।
मैं बिल्कुल नहीं कह सकता कि अंतर क्या है लेकिन बाइट स्तर पर काम करते समय एक अंतर प्रतीत होता है। निम्न एन्क्रिप्शन परिदृश्य में ऑब्जेक्ट।
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()। लेकिन किसी भी तरह से, यह जवाब एप्रोपोस नहीं है क्योंकि आप जिस प्रश्न के बारे में पूछते हैं, उसे एक अलग अधिभार कह रहे हैं।
नीचे 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);
}
String.valueOfइसका उपयोग किया जाता है। उन वस्तुओं के लिए जो स्ट्रीडिंग को ओवरराइड करते हैं, मुझे लगता है कि इसके बजाय String.valueOf कॉल कर सकते हैं। हालांकि उस हिस्से के बारे में निश्चित नहीं है।