टी एल; डॉ
जावा कैश से पूर्णांक उदाहरणों बॉक्सिंग -128
के लिए 127
। चूंकि आप मानों के बजाय ==
ऑब्जेक्ट संदर्भों की तुलना करने के लिए उपयोग कर रहे हैं , केवल कैश्ड ऑब्जेक्ट्स मेल खाएंगे। या तो अनबॉक्स्ड आदिम मूल्यों के साथ काम करें या अपनी वस्तुओं की तुलना करने के लिए उपयोग करें ।long
.equals()
Long
लम्बा (वाक्य का इरादा) संस्करण
127 से अधिक मूल्य वाले लॉन्ग वेरिएबल की तुलना करने में समस्या क्यों है? यदि उपरोक्त चर का डेटा प्रकार आदिम (लंबा) है, तो सभी मानों के लिए कोड काम करता है।
जावा कैश इंटेगर ऑब्जेक्ट्स की रेंज -128 से 127 तक है । ने कहा कि:
- यदि आप एन लॉन्ग वैरिएबल को वैल्यू
127
( कैश्ड ) पर सेट करते हैं , तो उसी ऑब्जेक्ट उदाहरण को सभी संदर्भों द्वारा इंगित किया जाएगा। (एन चर, 1 उदाहरण)
- यदि आप एन लॉन्ग वैरिएबल को वैल्यू सेट करते हैं
128
( कैश नहीं किया गया है ), तो आपके पास हर संदर्भ द्वारा इंगित ऑब्जेक्ट इंस्टेंस होगा। (एन चर, एन उदाहरण)
इसलिए यह है:
Long val1 = 127L;
Long val2 = 127L;
System.out.println(val1 == val2);
Long val3 = 128L;
Long val4 = 128L;
System.out.println(val3 == val4);
इसे आउटपुट करता है:
सच्चा
झूठा
के लिए 127L मूल्य, दोनों संदर्भों के बाद से (VAL1 और val2) बिंदु एक ही वस्तु उदाहरण के लिए स्मृति (कैश्ड) में, यह रिटर्नtrue
।
दूसरी ओर, 128 मान के लिए, क्योंकि इसके लिए कोई उदाहरण नहीं है, जो कि मेमोरी में कैश्ड है, बॉक्सिंग वैल्यू के लिए किसी भी नए असाइनमेंट के लिए एक नया बनाया जाता है, जिसके परिणामस्वरूप दो अलग-अलग इंस्टेंसेस (val3 और val4 द्वारा इंगित) और वापस आ रहे हैंfalse
रहे हैं। उनके बीच तुलना।
ऐसा केवल इसलिए होता है क्योंकि आप ऑपरेटर के साथ दो Long
ऑब्जेक्ट संदर्भों की तुलना कर रहे हैं , न कि long
आदिम मूल्यों की ==
। यदि यह इस कैश तंत्र के लिए नहीं था, तो ये तुलना हमेशा विफल रहेगी , इसलिए यहां वास्तविक समस्या ==
ऑपरेटर के साथ बॉक्सिंग मूल्यों की तुलना है ।
इन चरों को आदिम long
प्रकारों में बदलने से ऐसा होने से रोका जा सकेगा, लेकिन अगर आपको Long
वस्तुओं का उपयोग करके अपना कोड रखने की आवश्यकता होती है , तो आप निम्नलिखित तरीकों से इन तुलनाओं को सुरक्षित रूप से कर सकते हैं:
System.out.println(val3.equals(val4)); // true
System.out.println(val3.longValue() == val4.longValue()); // true
System.out.println((long)val3 == (long)val4); // true
(कास्टिंग के लिए उचित अशक्त जाँच आवश्यक है)
IMO , ऑब्जेक्ट की तुलना करते समय असमान () तरीकों के साथ रहना हमेशा एक अच्छा विचार है ।
संदर्भ लिंक:
.longValue()
।