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 के समान मान के संदर्भ में होगा।






assignment-operator