जावा में मुझे बताया गया है कि अशक्त जांच करते समय किसी को असमान () के बजाय == का उपयोग करना चाहिए। इसके क्या कारण हैं?
जावा में मुझे बताया गया है कि अशक्त जांच करते समय किसी को असमान () के बजाय == का उपयोग करना चाहिए। इसके क्या कारण हैं?
जवाबों:
वे दो पूरी तरह से अलग चीजें हैं। ==
एक चर द्वारा निहित वस्तु संदर्भ, यदि कोई हो, की तुलना करता है। .equals()
यह देखने के लिए जाँच करता है कि दो वस्तुओं को उनके अनुबंध के अनुसार समान होने का क्या मतलब है। यह दो अलग-अलग वस्तु उदाहरणों के लिए उनके अनुबंध के अनुसार "बराबर" होना पूरी तरह से संभव है। और फिर मामूली विस्तार है कि चूंकि equals
एक विधि है, यदि आप इसे एक null
संदर्भ पर लागू करने का प्रयास करते हैं , तो आपको एक मिल जाएगा NullPointerException
।
उदाहरण के लिए:
class Foo {
private int data;
Foo(int d) {
this.data = d;
}
@Override
public boolean equals(Object other) {
if (other == null || other.getClass() != this.getClass()) {
return false;
}
return ((Foo)other).data == this.data;
}
/* In a real class, you'd override `hashCode` here as well */
}
Foo f1 = new Foo(5);
Foo f2 = new Foo(5);
System.out.println(f1 == f2);
// outputs false, they're distinct object instances
System.out.println(f1.equals(f2));
// outputs true, they're "equal" according to their definition
Foo f3 = null;
System.out.println(f3 == null);
// outputs true, `f3` doesn't have any object reference assigned to it
System.out.println(f3.equals(null));
// Throws a NullPointerException, you can't dereference `f3`, it doesn't refer to anything
System.out.println(f1.equals(f3));
// Outputs false, since `f1` is a valid instance but `f3` is null,
// so one of the first checks inside the `Foo#equals` method will
// disallow the equality because it sees that `other` == null
public int data
?
Object
, हाँ। हालांकि, JDK वर्गों की एक बड़ी संख्या द्वारा इसे ओवरराइड किया गया है। लेकिन कार्यान्वयन के बारे में बात नहीं है, यह शब्दार्थ के बारे में है। (साइड नोट: JDK7 बहुत पुराना है।)
अगर तुम आह्वान .equals()
करते हो null
तो तुम पाओगेNullPointerException
इसलिए यह हमेशा लागू करने की विधि से पहले अशक्तता की जांच करना उचित है जहां यह कभी भी लागू होता है
if(str!=null && str.equals("hi")){
//str contains hi
}
और देखें
if ("hi".equals(str))
।
someObject.equals(null)
एक बढ़ा देंगे NullPointerException
कभी प्रवेश करने विधि के बराबर होती है बिना।
Objects.equals(a, b)
यह NullPointerException को नहीं बढ़ाएगा, लेकिन यह अभी भी "a" और "b" के "बराबर" तरीके पर निर्भर करता है
स्वीकृत उत्तर के अलावा ( https://stackoverflow.com/a/4501084/6276704 )
जावा 1.7 के बाद से, यदि आप दो वस्तुओं की तुलना करना चाहते हैं, जो शून्य हो सकती हैं, तो मैं इस फ़ंक्शन की सलाह देता हूं:
Objects.equals(onePossibleNull, twoPossibleNull)
java.util.Objects
इस वर्ग में वस्तुओं के संचालन के लिए स्थैतिक उपयोगिता के तरीके शामिल हैं। इन उपयोगिताओं में किसी वस्तु के हैश कोड की गणना करने, किसी वस्तु के लिए स्ट्रिंग लौटाने और दो वस्तुओं की तुलना करने के लिए शून्य-सुरक्षित या अशक्त-सहिष्णु तरीके शामिल हैं।
चूंकि: 1.7
Objects.equals(null, null)
वापस आ जाएगा true
- इसे ध्यान में रखें।
जावा में 0 या नल सरल प्रकार हैं और न कि वस्तुएं।
विधि समान () सरल प्रकारों के लिए नहीं बनाई गई है। सरल प्रकार == के साथ मिलान किया जा सकता है।
सूत्रों के अनुसार यह महत्वपूर्ण नहीं है कि डिफ़ॉल्ट विधि कार्यान्वयन के लिए क्या उपयोग किया जाए:
public boolean equals(Object object) {
return this == object;
}
लेकिन आप equals
कस्टम क्लास के बारे में निश्चित नहीं हो सकते ।
equals
केवल वापस आ false
सकता है NullPointerException
या एक (या कुछ अलग हो सकता है अगर ओवरराइड equals
विधि बकवास है)।
Object.equals शून्य सुरक्षित है, हालाँकि इस बात से अवगत रहें कि यदि दो ऑब्जेक्ट्स अशक्त हैं, तो object.equals सही रूप से वापस आ जाएंगे, इसलिए यह सुनिश्चित कर लें कि जिन ऑब्जेक्ट्स की आप तुलना कर रहे हैं, वे ऑब्जेक्ट का उपयोग करने से पहले null (या शून्य मानों को होल्ड) न करें। तुलना।
String firstname = null;
String lastname = null;
if(Objects.equals(firstname, lastname)){
System.out.println("equal!");
} else {
System.out.println("not equal!");
}
उदाहरण के स्निपेट ऊपर बराबर लौटेंगे!
क्योंकि समान एक ऑब्जेक्ट क्लास से प्राप्त फ़ंक्शन है, यह फ़ंक्शन क्लास के आइटम की तुलना करता है। यदि आप इसे शून्य के साथ उपयोग करते हैं तो यह गलत कारण लौटाएगा क्योंकि वर्ग सामग्री शून्य नहीं है। इसके अतिरिक्त == किसी वस्तु के संदर्भ की तुलना करता है।
false
या NullPointerException
(यदि equals
कुछ बुरा करने के लिए अतिरंजित नहीं है) हो सकता है।
यहाँ एक उदाहरण है, str != null
लेकिन str.equals(null)
जब उपयोग कर रहा हैorg.json
JSONObject jsonObj = new JSONObject("{field :null}");
Object field = jsonObj.get("field");
System.out.println(field != null); // => true
System.out.println( field.equals(null)); //=> true
System.out.println( field.getClass()); // => org.json.JSONObject$Null
संपादित करें:
यहाँ org.json.JSONObject $ Null वर्ग है:
/**
* JSONObject.NULL is equivalent to the value that JavaScript calls null,
* whilst Java's null is equivalent to the value that JavaScript calls
* undefined.
*/
private static final class Null {
/**
* A Null object is equal to the null value and to itself.
*
* @param object
* An object to test for nullness.
* @return true if the object parameter is the JSONObject.NULL object or
* null.
*/
@Override
public boolean equals(Object object) {
return object == null || object == this;
}
}
field.equals(null)
रिटर्न सही है। यह सामान्य जावा व्यवहार को तोड़ता है और इसलिए भ्रामक है। यह केवल field.equals("null")
मेरे दृष्टिकोण में, कम से कम काम करना चाहिए । मुझे नहीं पता कि पुस्तकालय डेवलपर्स ने क्यों सोचा, कि यह समर्थन करना अच्छा होगा।
str != null
और str.equals(null)
बदले true
का उपयोग करते समय org.json ।"?
jsonObject
"फ़ील्ड" कुंजी में यह है कि क्यों field
अशक्त नहीं है, यह एक संदर्भ है जिसमें json.org.JSONObject$Null
वस्तु शामिल है
Null
की तरह null
और प्रयोग करेंगे "null"
बजाय। लेकिन मुझे लगता है कि उन्होंने स्ट्रिंग्स की आवश्यकता से बचने के लिए ऐसा किया है। लेकिन उस परिवाद के साथ, field.equals(null)
अभी भी लगभग हमेशा एक मुद्दा है: पी।
इसलिए मैं कभी भ्रमित नहीं होता और इस समाधान के साथ समस्याओं से बचता हूं:
if(str.trim().length() <=0 ) {
// is null !
}
""
लंबाई 0) एक null
संदर्भ (यानी कोई स्ट्रिंग) की तुलना में पूरी तरह से अलग है ।
आप कोड तोड़ते हैं Demeter कानून। इसीलिए बेहतर है कि डिज़ाइन को ही रिफ्लेक्टर करें। वैकल्पिक हल के रूप में, आप वैकल्पिक का उपयोग कर सकते हैं
obj = Optional.ofNullable(object1)
.map(o -> o.getIdObject11())
.map(o -> o.getIdObject111())
.map(o -> o.getDescription())
.orElse("")
उपरोक्त किसी वस्तु के पदानुक्रम की जाँच करना है, इसलिए बस उपयोग करें
Optional.ofNullable(object1)
अगर आपके पास जांच के लिए केवल एक ही वस्तु है
उम्मीद है की यह मदद करेगा !!!!
आप हमेशा कर सकते हैं
if (str == null || str.equals(null))
यह पहले ऑब्जेक्ट रेफरेंस की जाँच करेगा और फिर ऑब्जेक्ट को अपने आप में रेफरेंस नहीं करेगा।
x.equals(null)
।
equals()
देखने और देखने की कोशिश करना । जब आप कोशिश करते हैं तो यह तुरंत स्पष्ट हो जाएगा