दिलचस्प पोस्ट
जावा: तिथि से महीना पूर्णांक प्राप्त करें लॉक / अनलॉक स्क्रीन प्रोग्राम कैसे करें? जावास्क्रिप्ट कॉलर फंक्शन लाइन नंबर कैसे प्राप्त करें? जावास्क्रिप्ट कॉलर स्रोत यूआरएल कैसे प्राप्त करें? मैं कुंजी मान को कैसे देख सकता हूं और एक UView के फ्रेम पर एक केवीओ कॉलबैक प्राप्त कर सकता हूं? केवल संख्याओं के लिए रेगेक्स एसक्यूएल बनाम एसक्यूएल उपश्रेणीयां (प्रदर्शन)? ग्रहण का कहना है: "उपयोग में कार्यस्थान या बनाया नहीं जा सकता, एक अलग एक चुना।" मैं एक कार्यक्षेत्र कैसे अनलॉक करूँ? कैसे% से बचने के लिए (%) सी printf में हस्ताक्षर? रैवल्यूज़, लावल्यूस, एक्सवल्यूज, ग्लुवेल और प्रोजेल्स क्या हैं? इकाई फ़्रेमवर्क और बिजनेस ऑब्जेक्ट्स अतुल्यकालिक कार्य थ्रॉटलिंग अंतराल सेट / कुशल ओवरलैप जुड़ने के बीच ओवरलैपिंग ढूँढना सीडी में ऑब्जेक्ट के लिए XML को डीसरिलाइज़ करना 'केवल एक रिएक्ट ओनर के पास रिफ हो सकता है।' क्या मतलब है? WPF: स्वत: पूर्ण पाठ बॉक्स, … फिर से

क्यों बराबर ऑपरेटर 128 अंक तक पूर्णांक मूल्य के लिए काम करता है?

क्यों पूर्णांक "=" ऑपरेटर 128 और पूर्णांक मान के लिए काम नहीं करता है? क्या कोई इस स्थिति को समझा सकता है?

यह मेरा जावा वातावरण है: जावा संस्करण "1.6.0_37"

जावा (टीएम) एसई रनटाइम पर्यावरण (1.6.0_37-बी 066 का निर्माण)

जावा हॉटस्पॉट (टीएम) 64-बिट सर्वर वीएम (20.12-बी01, मिश्रित मोड का निर्माण)

नमूना कोड:

Integer a; Integer b; a = 129; b = 129; for (int i = 0; i < 200; i++) { a = i; b = i; if (a != b) { System.out.println("Value:"+ i + " - Different values"); } else { System.out.println("Value"+ i + " Same values"); } } 

कंसोल आउटपुट का कुछ हिस्सा:

 Value:124 - Same values Value:125 - Same values Value:126 - Same values Value:127 - Same values Value:128 - Different values Value:129 - Different values Value:130 - Different values Value:131 - Different values Value:132 - Different values 

धन्यवाद!

वेब के समाधान से एकत्रित समाधान "क्यों बराबर ऑपरेटर 128 अंक तक पूर्णांक मूल्य के लिए काम करता है?"

पूर्णांक का स्रोत कोड देखें आप वहां मूल्यों की कैशिंग देख सकते हैं।

कैशिंग तब होता है जब आप Integer.valueOf(int) उपयोग करते हैं, न कि यदि आप new Integer(int) उपयोग करते हैं आपके द्वारा उपयोग की गई Integer.valueOf का उपयोग करती है

जेएलएस के मुताबिक, आप हमेशा इस तथ्य पर भरोसा कर सकते हैं कि -128 और 127 के बीच के मूल्यों के लिए, आपको ऑटोबॉक्स्िंग के बाद एक समान पूर्णांक वस्तु मिलती है, और कुछ कार्यान्वयनों पर आपको उच्च मूल्यों के लिए समान वस्तुएं भी मिल सकती हैं।

वास्तव में जावा 7 में (और मैं जावा 6 के नए संस्करणों में सोचता हूं), पूर्णांककैचे वर्ग के कार्यान्वयन में बदलाव आया है, और ऊपरी बाउंड अब कठिन नहीं है, लेकिन यह संपत्ति "java.lang.Integer.IntegerCache" के माध्यम से विन्यास योग्य है। उच्च "है, इसलिए यदि आप वीएम पैरामीटर के साथ अपना प्रोग्राम चलाते -Djava.lang.Integer.IntegerCache.high=1000 , आप सभी मूल्यों के लिए" समान मान "प्राप्त करते हैं

लेकिन जेएलएस अभी भी 127 तक ही गारंटी देता है:

आदर्श रूप से, किसी दिए गए आदिम मूल्य को मुक्केबाजी करना, हमेशा एक समान संदर्भ पैदा करेगा। व्यवहार में, यह मौजूदा कार्यान्वयन तकनीकों का उपयोग करना संभव नहीं हो सकता है। ऊपर दिए गए नियम व्यावहारिक समझौता हैं। ऊपर दिए गए अंतिम खंड के लिए आवश्यक है कि कुछ सामान्य मानों को हमेशा अलग-अलग पहचाने जाने योग्य ऑब्जेक्ट में बॉक्स किया जाना चाहिए। कार्यान्वयन इन, आलसी या बेसब्री से कैश कर सकते हैं

अन्य मूल्यों के लिए, यह प्रपत्र प्रोग्रामर के भाग पर बॉक्सिंग मानों की पहचान के बारे में कोई मान्यताओं को अस्वीकार करता है। यह कुछ या सभी संदर्भों को साझा करने (लेकिन आवश्यकता नहीं) की अनुमति देगा

यह सुनिश्चित करता है कि अधिकतर सामान्य मामलों में, अनुचित प्रदर्शन जुर्माना विशेषकर छोटे उपकरणों पर लागू किए बिना व्यवहार वांछित होगा। कम मेमोरी-सीमित कार्यान्वयन, उदाहरण के लिए, सभी वर्णों और शॉर्ट्स के साथ-साथ पूर्णांक और लंबे समय तक -32 के -रेब -32 के कैश में कैश कर सकते हैं।

Integer int लिए एक आवरण वर्ग है।

Integer != Integer वास्तविक वस्तु संदर्भ की तुलना करता है, जहां int != int मूल्यों की तुलना करेगा।

जैसा कि पहले ही कहा गया है, मूल्य -128 से 127 कैश्ड हैं, इसलिए एक ही ऑब्जेक्ट उन लोगों के लिए लौटाए जाते हैं।

अगर उस सीमा के बाहर, अलग ऑब्जेक्ट्स बनाए जाएंगे तो संदर्भ अलग होगा।

ठीक करना:

  • प्रकारों को बनाइए या फिर
  • टाइप करने के लिए int या
  • उपयोग .equals()

जावा भाषा निर्दिष्टीकरण के अनुसार:

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

JLS मुक्केबाजी रूपांतरण

इंट कैशिंग पर अधिक जानकारी के लिए इस आलेख को देखें

पूर्णांक वस्तु में एक आंतरिक कैश तंत्र है:

 private static class IntegerCache { static final int high; static final Integer cache[]; static { final int low = -128; // high value may be configured by property int h = 127; if (integerCacheHighPropValue != null) { // Use Long.decode here to avoid invoking methods that // require Integer's autoboxing cache to be initialized int i = Long.decode(integerCacheHighPropValue).intValue(); i = Math.max(i, 127); // Maximum array size is Integer.MAX_VALUE h = Math.min(i, Integer.MAX_VALUE - -low); } high = h; cache = new Integer[(high - low) + 1]; int j = low; for(int k = 0; k < cache.length; k++) cache[k] = new Integer(j++); } private IntegerCache() {} } 

इसके अलावा valueOf विधि देखें:

 public static Integer valueOf(int i) { if(i >= -128 && i <= IntegerCache.high) return IntegerCache.cache[i + 128]; else return new Integer(i); } 

यही कारण है कि आपको new Integer बजाय valueOf उपयोग करना चाहिए ऑटोबॉक्ज़िंग इस कैश का उपयोग करता है।

इस पोस्ट को भी देखें: https://effective-java.com/2010/01/java-performance-tuning-with-maximizing-integer-valueofint/

== का उपयोग करना एक अच्छा विचार नहीं है, मूल्यों की तुलना करने के लिए उपयोग बराबर होता है

== बजाय .equals() उपयोग करें

पूर्णांक मान केवल -127 और 128 के बीच के नंबरों के लिए कैश किए जाते हैं, क्योंकि वे सबसे अक्सर उपयोग किए जाते हैं

 if (a.equals(b)) { ... } 

अपने Integer उदाहरणों के आधार पर, यह किसी भी मूल्य के लिए काम नहीं करेगा:

 System.out.println(new Integer(1) == new Integer(1)); 

प्रिंट

 false 

इसका कारण यह है कि == ऑपरेटर को संदर्भ-टाइप ऑपेंडों पर लागू किया गया है उन मूल्यों के साथ कुछ भी नहीं करना जो उन ऑपरेंडों का प्रतिनिधित्व करते हैं।

ऐसा इसलिए है क्योंकि Integer वर्ग कार्यान्वयन तर्क इसने 128 तक संख्या के लिए ऑब्जेक्ट तैयार किए हैं। आप http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang/Integer.java खोलने का स्रोत चेकआउट कर सकते हैं उदाहरण के लिए- jdk (कैश के लिए खोज [])
मूल रूप से वस्तुएं == का उपयोग करके तुलना नहीं की जानी चाहिए, इन्रोम के एक अपवाद के साथ।