दिलचस्प पोस्ट
सी ++ में ऑब्जेक्ट के प्रकार को ढूंढना कैसे एक अल्पविराम से अलग स्ट्रिंग विभाजित करने के लिए? रेल: एक फॉर्म में मल्टी-सबमिट बटन jQuery UI संवाद बॉक्स केंद्र स्क्रीन पर स्थित नहीं है एंटाइटेलमेंट मान्य नहीं हैं जीडब्ल्यूटी थीम शैली मेरी सीएसएस शैली को ओवरराइड करती है क्या मैं संख्या बेस क्लास पर अंकगणित संचालन कर सकता हूं? सरलतम और साफ सी ++ 11 स्कोपगार्ड पूरे ऑब्जेक्ट को फ़ेच करने के बिना एक-टू-एक: सीएफ़आईएनटी () हाइबरनेट करें अभी भी सहानुभूति और भ्रम और अंदर / बाहर के बारे में उलझन में है उपलब्ध स्थान को भरने के लिए WPF में नियंत्रण कैसे प्राप्त करें? मैं किसी बाश स्क्रिप्ट के चलने के समय को कैसे सीमित कर सकता हूँ पीडीएफ़ को एक रिपोर्ट निर्यात करते वक्त फ़ॉन्ट बदलते हैं Python parse सीएसवी डबल उद्धरण के साथ अल्पविराम पर ध्यान केंद्रित पृष्ठभूमि में आईओएस डिवाइस के लिए जीसीएम काम करना

जावा स्ट्रिंग शाब्दिक पूल और स्ट्रिंग के संयोजन के बारे में एक भ्रम

सब, मुझे एक समस्या का सामना करना पड़ा जब नीचे कोड लिखना

String hello = "Hello"; String str5 = "Hel" + "lo"; String str8 = "Hel"; String str9 = "lo"; String str10 = str8 + str9; System.out.println("str10==hello?" + (str10 == hello)); System.out.println("str5==hello?" + (str5 == hello)); System.out.println("str10==str5?" + (str10 == str5)); 

तो मैं अपना कोड चलाता हूं और कंसोल प्रिंट करता हूं

 str10 == hello ? false str5 == hello ? true str10 == str5 ? false 

यह मुझे बहुत उलझन में है क्यों दूसरा प्रिंट सच है लेकिन पहला प्रिंट गलत ?? स्ट्रिंग शाब्दिक पूल की मेरी समझ में, जब एक स्ट्रिंग परिभाषित होती है और JVM जांच करेगा कि पूल में वह स्ट्रिंग है, यदि नहीं, तो स्ट्रिंग को पूल में रखें
मेरे कोड में, चर हेली नमक पूल में मौजूद है, पूल में " हेलो " और " लो " भी मेरा प्रश्न है

  1. अगर पूल में " हेलो " और " लो " के समापन के परिणाम मौजूद हैं
  2. str5 और str10s के बारे में परिभाषा के बीच अंतर क्या है, और वे "==" क्यों नहीं हैं? स्ट्रिंग और स्ट्रबल को अलग-अलग " हैलो " को संदर्भित करता है जो कि स्ट्रिंग पूल में होता है? ("==" का अर्थ यह है कि संदर्भ एक ही वस्तु है)

मेरा जेडीके संस्करण: 1.6.0_2 9
मेरी आईडीई: इंटेलेल आइडिया 11.2

कोई भी इसे बता सकता है? आपका बहुत बहुत धन्यवाद

Solutions Collecting From Web of "जावा स्ट्रिंग शाब्दिक पूल और स्ट्रिंग के संयोजन के बारे में एक भ्रम"

यह व्यवहार करना चाहिए यह जेएलएस के दो हिस्सों में दिखाया गया है।

जेएलएस # 3.10.5 :

स्ट्रिंग्स जो निरंतर अभिव्यक्ति (§15.28) के मूल्य हैं – "interned" हैं, ताकि विधि String.intern का उपयोग करके अद्वितीय उदाहरण साझा करें।

जेएलएस # 15.28 सूची जो निरंतर अभिव्यक्ति के रूप में माना जाता है विशेष रूप से, स्ट्रिंग लिटरल्स निरंतर अभिव्यक्ति ("हेल" और "लो") हैं लेकिन एक चर के लिए एक स्थिर माना जाता है, इसे अंतिम होना चाहिए।

आपके मामले में, अगर आप str9 और str9 स्थिर बनाने के लिए थोड़ा अपना कोड बदलते हैं, तो आपको तीन बार true मिलेगा:

 final String str8 = "Hel"; final String str9 = "lo"; 

इस कोड पर विचार करने के लिए निम्नलिखित बिंदु हैं:

 String hello = "Hello"; 

यहां "हैलो" एक शाब्दिक है जिसे नमस्ते संदर्भ में सौंपा गया है, इस प्रकार शाब्दिक की अपनी हीशोड है

 String str5 = "Hel" + "lo"; 

यहां "हेल" + "लो" 2 लीटरल जोड़ हैं और नमस्ते को संदर्भित करने के लिए निर्दिष्ट किया जाता है, इस प्रकार नये शाब्दिक पहले एक के समान है और इस प्रकार उसी हैशोड

 String str8 = "Hel"; String str9 = "lo"; 

यहाँ str8 + str9 2 संदर्भ हैं जो गठबंधन करते हैं और एक नया संदर्भ हेलो को इंगित करते हैं इस प्रकार नए शाब्दिक की अपनी हीशोड है

 String str10 = str8 + str9; System.out.println("str10==hello?" + (str10 == hello)); System.out.println("str5==hello?" + (str5 == hello)); System.out.println("str10==str5?" + (str10 == str5)); 

जब आप उपयोग करते हैं == यह हैश कोड और मान से मेल खाता है इस प्रकार बेमेल

उपयोग करने का प्रयास करें

string_1.equals (STRING_2)

के बजाय

स्ट्रिंग_1 == स्ट्रिंग_2

और आपको मूल्य केवल मिल जाएगा। इस प्रकार सभी सच

कृपया नीचे दिए गए उत्तर भी देखें (जावा में == बनाम बराबर () में क्या अंतर है? ):

स्ट्रिंग उदाहरण (ढेर पर) के बराबर "मान" की तुलना में चाहे दो (2) ऑब्जेक्ट संदर्भ समान स्ट्रिंग इन्सेंटेशन को देखें या नहीं। अगर किसी भी दो (2) ऑब्जेक्ट संदर्भ स्ट्रिंग का एक ही स्ट्रिंग उदाहरण का संदर्भ लें तो महान! यदि दो (2) ऑब्जेक्ट संदर्भ दो (2) अलग स्ट्रिंग उदाहरणों का संदर्भ देते हैं तो यह कोई फर्क नहीं पड़ता है। इसके "मूल्य" (वह है: वर्ण सरणी की सामग्री) प्रत्येक स्ट्रिंग उदाहरण के अंदर जो तुलना की जा रही है।

दूसरी ओर, "==" ऑपरेटर दो ऑब्जेक्ट संदर्भों के मूल्य की तुलना देखने के लिए करता है कि क्या वे एक ही स्ट्रिंग इन्सेंट को देखें। यदि दोनों ऑब्जेक्ट संदर्भों का मान वही स्ट्रिंग इन्सेंटेशन "देखें" तो बुलियन एक्सप्रेशन का नतीजा "सच्चा" होगा। डुह। यदि, दूसरी तरफ, दोनों ऑब्जेक्ट संदर्भों का मान अलग-अलग स्ट्रिंग इंस्टॉन्सन्स ("स्ट्रिंग इंस्टॉन्शंस" का उल्लेख करते हैं, भले ही दोनों स्ट्रिंग इंस्टेंस समान "मान" हैं, अर्थात प्रत्येक स्ट्रिंग इन्सेंटेशन के कैरेक्टर एरेज़ की सामग्री समान होती है) बूलियन अभिव्यक्ति का परिणाम "गलत" होगा

 String hello = "Hello"; // at compile time string is known so in String Constant Pool String str5 = "Hel" + "lo"; // at compile time string is known so in String Constant Pool same object as in variable hello String str8 = "Hel"; // at compile time string is known so in String Constant Pool String str9 = "lo"; // at compile time string is known so in String Constant Pool String str10 = str8 + str9; // at runtime don't know values of str8 and str9 so in String Constant Pool new object different from variable hello str10 == hello ? false // as str10 has new object and not the same as in hello str5 == hello ? true // both were created at compile time so compiler know what's the result in str5 and referenced the same object to str5 as in hello str10 == str5 ? false // str10 is a different object, hello and str5 are referenced same object as created at compile time. 

अगर यू दो स्ट्रिंग्स का इस्तेमाल करते हैं तो स्ट्रिंग का उपयोग करें। string1 == string2 नहीं string1 == string2

कोशिश करो:

 System.out.println("str10==hello?" + (str10.equals(hello));