java - जावा असाइनमेंट ऑपरेटर निष्पादन
string equals (6)
Reimus ने सही उत्तर दिया, लेकिन मैं विस्तार से बताना चाहूंगा।
जावा (और अधिकांश भाषाओं) में कन्वेंशन चर पर बाईं ओर है, दाईं ओर असाइनमेंट।
चलो इसे तोड़ दो:
String x = "hello";
//x <- "hello"
String y = "goodbye";
//y <- "goodbye";
डिबगिंग उद्देश्यों के साथ-साथ कोड पठनीयता के लिए, अपनी पंक्तियों को विभाजित करने के लिए हमेशा एक अच्छा अभ्यास होता है ताकि वे केवल एक ही काम करें।
System.out.println(x.equals(x = y)); //Compound statement
यहाँ,
x.equals(...)
को x, या "हैलो" के मूल संदर्भ में कहा जाता है, इसे दूसरे संदर्भ के लिए अद्यतन किया जाता है।
मैं इसे इस रूप में लिखूंगा (और यह आपको आपका अपेक्षित जवाब देगा):
x = y;
// x <- y = "goodbye"
boolean xEqualsX = x.equals(x);
// xEqualsX <- true
System.out.println(xEqualsX);
// "true"
अब यह स्पष्ट प्रतीत होता है कि इसे इस तरह से व्यवहार करना चाहिए, लेकिन वास्तव में यह देखना भी आसान है कि प्रत्येक पंक्ति में क्या चल रहा है, जो कि आप के लिए प्रयास करना चाहिए।
जावा में, मैं समझता हूं कि असाइनमेंट सही ऑपरेंड के मूल्य का मूल्यांकन करता है, इसलिए
x == (y = x)
जैसे कथन
true
मूल्यांकन करते
true
।
यह कोड, हालांकि,
false
आउटपुट देता
false
।
public static void main(String[]args){
String x = "hello";
String y = "goodbye";
System.out.println(x.equals(x = y));
}
ऐसा क्यों है?
मेरी समझ में, यह पहले
(x = y)
मूल्यांकन करता है, जो
x
को
y
का मान
y
, और फिर
y
का मान लौटाता है।
फिर
x.equals(y)
का मूल्यांकन किया जाता है, जो
x
और
y
बाद से एक ही संदर्भ को साझा करना चाहिए, लेकिन इसके बजाय, मुझे
true
होना चाहिए, लेकिन इसके बजाय, मुझे
false
।
यहां क्या हो रहा है?
अच्छा प्रश्न! और JLS का जवाब है ...
§15.12.4.1 (उदाहरण 15.12.4.1-2)। विधि मंगलाचरण के दौरान मूल्यांकन आदेश:
एक उदाहरण विधि आह्वान के हिस्से के रूप में, एक अभिव्यक्ति है जो वस्तु को आह्वान करने के लिए दर्शाता है। यह अभिव्यक्ति किसी भी तर्क अभिव्यक्ति के किसी भी भाग से पहले विधि मंगलाचरण का मूल्यांकन करने के लिए पूरी तरह से मूल्यांकन किया गया प्रतीत होता है।
तो, इसमें:
String x = "hello";
String y = "goodbye";
System.out.println(x.equals(x = y));
x
की घटना से पहले।
.equals
का मूल्यांकन पहले किया जाता है, तर्क अभिव्यक्ति
x = y
।
इसलिए, स्ट्रिंग
hello
को संदर्भित करने के लिए स्थानीय चर
x
को बदलने से पहले स्ट्रिंग
hello
संदर्भ को लक्ष्य संदर्भ के रूप में याद किया जाता है।
परिणामस्वरूप, तर्क विधि
goodbye
साथ लक्ष्य ऑब्जेक्ट
hello
लिए
equals
पद्धति लागू की जाती है, इसलिए मंगलाचरण का परिणाम
false
।
जावा में स्ट्रिंग एक वर्ग है।
String x = "hello";
String y = "goodbye";
एक दो अलग स्ट्रिंग है जो दो अलग-अलग मूल्य को संदर्भित करता है जो समान नहीं है और यदि आप तुलना करते हैं
System.out.println(x.equals(x = y));
//this compare value (hello and goodbye) return true
System.out.println(x == (y = x));
// this compare reference of an object (x and y) return false
मैं आम आदमी के सवालों को
"hello".equals("goodbye")
रूप में देखता हूं।
"hello".equals("goodbye")
।
तो यह झूठा लौटता है।
यह देख रहा है कि क्या x.equals (x को y पर नियत करता है, हमेशा सही लौटाता है) तो मूल रूप से x.equals (सत्य)
यह याद रखना महत्वपूर्ण है कि
String
इन जावा एक वस्तु है, और इसलिए एक संदर्भ है।
जब तुमने फोन किया
x.equals(...)
यह जाँच कर रहा है कि वर्तमान में
x
द्वारा संदर्भित स्थान पर मान आपके द्वारा पास किए जा रहे समान के बराबर है। अंदर, आप मान को बदल रहे हैं कि
x
संदर्भित कर रहा है
, लेकिन आप अभी भी
मूल
संदर्भ ("हैलो" के संदर्भ में
equals
कहते हैं) ")।
तो, अभी आपका कोड यह देखने के लिए तुलना कर रहा है कि क्या "हैलो" "अलविदा" के बराबर है, जो कि स्पष्ट रूप से नहीं है।
इस बिंदु के बाद, यदि आप फिर से
x
उपयोग करते हैं, तो इसका परिणाम y के समान मान के संदर्भ में होगा।