दिलचस्प पोस्ट
एंड्रॉइड में स्पिनर पर छोटे त्रिकोण का रंग बदलें Android में पॉजो क्लास की क्लास आइटम के आधार पर कस्टमलिस्टिस्ट में खोज कैसे कार्यान्वित करें? जावा में अद्वितीय यादृच्छिक संख्या का सेट उत्पन्न करें AngularJs में $ मार्गप्रदाता और $ राज्य प्रदाता के बीच क्या अंतर है DbContext निपटान के बिना परिवर्तन त्यागें अजगर पंडों को वर्ष भर से वर्ष निकालने – डीएफ = डीएफ वर्ष काम नहीं कर रहा है। 64 बिट एंड्रॉइड-एल प्लेटफॉर्म पर 32 बिट नेटिव्ह लाइब्रेरी का उपयोग कैसे करें दो या अधिक कंटेनरों को एक साथ फिर से चलाने का सबसे अच्छा तरीका क्या है 'के लिए' छोरों का प्रयोग करके शब्दकोशों पर परावर्तित करना एंड्रॉइड: सामग्री यूआरआई से फाइल यूआरआई प्राप्त करना? मैं नेटवर्क अंतरफलक और इसका सही IPv4 पता कैसे प्राप्त करूं? क्रॉस ब्राउज़र सीएसएस ज़ूम के लिए पूर्ण शैलियों UISearchBar + iPhone में प्रकट होने वाले रद्द करें बटन के डिफ़ॉल्ट टेक्स्ट को कैसे बदलें सी # स्ट्रोक्ट्स: असाइन किए गए स्थानीय चर? टाइमस्टैम्प को तारीख को MySQL क्वेरी में कनवर्ट करें

कैसे! = और == ऑपरेटर जावा में इंटीजर्स पर काम करते हैं?

नीचे दिए गए कोड वास्तव में मुझे भ्रमित करने लगे क्योंकि यह दो भिन्न आउटपुट प्रदान करता था। कोड को जेडीके 1.7 पर परीक्षण किया गया था।

public class NotEq { public static void main(String[] args) { ver1(); System.out.println(); ver2(); } public static void ver1() { Integer a = 128; Integer b = 128; if (a == b) { System.out.println("Equal Object"); } if (a != b) { System.out.println("Different objects"); } if (a.equals(b)) { System.out.println("Meaningfully equal."); } } public static void ver2() { Integer i1 = 127; Integer i2 = 127; if (i1 == i2) { System.out.println("Equal Object"); } if (i1 != i2){ System.out.println("Different objects"); } if (i1.equals(i2)){ System.out.println("Meaningfully equal"); } } } 

आउटपुट:

[वी 1 आउटपुट]
विभिन्न वस्तुओं
अर्थात् बराबर

[वी 2 आउटपुट]
समान ऑब्जेक्ट
अर्थात् बराबर

क्यों == और! = परीक्षण ver1 () और ver2 () के लिए एक ही नंबर के लिए पूर्णांक से बहुत कम परिणाम उत्पन्न करता है? MAX_VALUE? क्या यह निष्कर्ष निकाला जा सकता है कि == 127 से अधिक संख्याओं की जांच (कोड में दिखाए गए पूर्णांक जैसे आवरण वर्गों के लिए) पूरी तरह समय की बर्बादी है?

Solutions Collecting From Web of "कैसे! = और == ऑपरेटर जावा में इंटीजर्स पर काम करते हैं?"

Integer i = 127 127 और 127 के बीच के मानों के लिए कैश किए गए हैं इसलिए Integer i = 127 हमेशा एक ही संदर्भ वापस करेगा। Integer j = 128 ऐसा आवश्यक नहीं होगा फिर आपको अंतर्निहित int की समानता के लिए परीक्षण करने के लिए equals का उपयोग करना होगा

यह जावा भाषा विशिष्टता का एक हिस्सा है:

यदि मान पी बॉक्सिंग सही है, गलत, एक बाइट, या एक रेंज को सीमा में \ u0000 से \ u007f, या एक int या छोटी संख्या के बीच -128 और 127 (समावेशी), तो r1 और r2 का परिणाम हो पी के किसी भी दो मुक्केबाजी रूपांतरण यह हमेशा ऐसा मामला है कि r1 == r2

लेकिन Integer j = 128 लिए 2 कॉल्स समान संदर्भ वापस नहीं कर सकते (गारंटी नहीं):

कम मेमोरी-सीमित कार्यान्वयन, उदाहरण के लिए, सभी चार और लघु मूल्यों को कैश कर सकते हैं, साथ ही इंट और लाँग वेल्यू -32 के टू -32 के रेंज में।

क्योंकि जावा में छोटे पूर्णांक interned हैं, और आप "छोटी सी" सीमा के विभिन्न पक्षों पर नंबरों की कोशिश की।

इसमें एक पूर्णांक ऑब्जेक्ट कैश 128 से और डिफ़ॉल्ट रूप से 127 तक मौजूद है। ऊपरी सीमा को कॉन्फ़िगर किया जा सकता है। ऊपरी कैश सीमा को वीएम विकल्प -XX:AutoBoxCacheMax=<size> द्वारा नियंत्रित किया जा सकता है -XX:AutoBoxCacheMax=<size>

जब आप फ़ॉर्म का उपयोग करते हैं तो आप इस कैश का उपयोग कर रहे हैं:

  Integer i1 = 127; 

या

 Integer i1 = Integer.valueOf(127); 

लेकिन जब आप उपयोग करते हैं

 Integer i1 = new Integer(127); 

तो आपको एक नया अपरिष्कृत ऑब्जेक्ट प्राप्त करने की गारंटी है। बाद के मामले में दोनों संस्करण एक ही परिणाम मुद्रित करते हैं। कैश्ड संस्करणों का उपयोग करना भिन्न हो सकता है

https://www.owasp.org/index.php/Java_gotchas

मुझे अपने प्रोफेसरों में से एक से यह लिंक मिला है, बहुत जानकारीपूर्ण है

Java caches पूर्णांक -128 से 127 के लिए यही कारण है कि वस्तुओं एक ही हैं।

मुझे लगता है कि == और! = ऑपरेटरों, जब वे प्राथमिकता से काम करते हैं, तो काम करेंगे कि आप वर्तमान में उनका उपयोग क्यों कर रहे हैं, लेकिन वस्तुओं के साथ (पूर्णांक बनाम। Int) आप .equals () विधि के साथ परीक्षण करना चाहते हैं।

मैं इस पर निश्चित नहीं हूँ, लेकिन ऑब्जेक्ट्स के साथ == परीक्षण करेगा अगर एक ऑब्जेक्ट एक ही ऑब्जेक्ट है या नहीं, जबकि .एक्वायल्स () परीक्षण को निष्पादित करेगा कि उन दो ऑब्जेक्ट्स में मूल्य में समरूपता है (या विधि की आवश्यकता होगी कस्टम ऑब्जेक्ट के लिए बनाई गई / ओवरराइड)