दिलचस्प पोस्ट
आप कैसे जांचते हैं कि जावा में एक संख्या NaN है? मेटाडेटा अपवाद: निर्दिष्ट मेटाडेटा संसाधन लोड करने में असमर्थ सरणी में लाइन घोषित करने का कोई तरीका? jQuery इवेंट: एक div का HTML / पाठ में परिवर्तन का पता लगाएं मैं सभी विराम चिह्नों को स्ट्रैगेज़ में एक स्ट्रिंग से regex का उपयोग कैसे कर सकता हूं? event.wheelDelta रिटर्न अनिर्धारित किसी सामग्री के तत्व में एचटीएमएल के साथ चयनित पाठ को कैसे बदलना है? गिट में ईविल विलीन हो जाता है? आवधिक अंतराल पर चलाने के लिए मैं एक कार्य का शेड्यूल कैसे कर सकता हूं? जावास्क्रिप्ट किसी भी वेब पेज के स्रोत को पढ़ सकता है? क्या jtextfield और jlist का उपयोग करने के लिए एक स्वत: पूर्ण होना संभव है? Google-services.json वास्तव में क्या करता है? वर्तमान गतिविधि से रूट दृश्य प्राप्त करें मेरे जेएसपी पृष्ठ में स्क्रिप्टलेट्स का उपयोग करने से कैसे बचें? एक NSString में एक सबस्ट्रिंग की संख्या की संख्या?

जावा में इंटीजर कैशिंग

संभव डुप्लिकेट:
अजीब जावा मुक्केबाजी

हाल ही में मैंने एक प्रस्तुति देखी जहां जावा कोड का निम्नलिखित नमूना था:

Integer a = 1000, b = 1000; System.out.println(a == b); // false Integer c = 100, d = 100; System.out.println(c == d); // true 

अब मैं थोड़ा उलझन में हूँ। मैं समझता हूं कि पहले मामले में परिणाम "झूठा" क्यों है – यह इसलिए है कि पूर्णांक एक संदर्भ प्रकार है और "a" और "b" के संदर्भ अलग हैं।

लेकिन दूसरे मामले में परिणाम "सच" क्यों है?

मैंने एक राय सुना है, कि कुछ अनुकूलन प्रयोजनों के लिए जेएमएम -128 से 127 के लिए इंट वैल्यू के लिए ऑब्जेक्ट को कैशिंग करता है। इस तरह, "c" और "d" के संदर्भ समान हैं

क्या कोई मुझे इस व्यवहार के बारे में अधिक जानकारी दे सकता है? मैं इस अनुकूलन के उद्देश्यों को समझना चाहता हूं। किस मामले में प्रदर्शन बढ़ा है, आदि। इस समस्या के कुछ शोध के संदर्भ में महान होगा।

वेब के समाधान से एकत्रित समाधान "जावा में इंटीजर कैशिंग"

मैं इस अनुकूलन के उद्देश्यों को समझना चाहता हूं। किस मामले में प्रदर्शन बढ़ा है, आदि। इस समस्या के कुछ शोध के संदर्भ में महान होगा।

उद्देश्य मुख्य रूप से स्मृति को बचाने के लिए है, जो बेहतर कैश दक्षता के कारण तेजी से कोड की ओर जाता है।

असल में, Integer क्लास -128 से 127 की श्रेणी में Integer उदाहरणों का कैश रखता है, और सभी ऑटोबॉक्सिंग, लीटरल और Integer.valueOf() का उपयोग उस श्रेणी के कवर के लिए उस कैश से उदाहरण लौटाएंगे।

यह धारणा पर आधारित है कि इन छोटे मूल्यों को अन्य चीजों के मुकाबले अधिक बार देखा जाता है और इसलिए यह प्रत्येक आवेश (एक Integer वस्तु 12 बाइट्स की तरह कुछ लेता है) के लिए विभिन्न ऑब्जेक्ट होने के ओवरहेड से बचने के लिए समझ में आता है।

Integer.valueOf(int) के कार्यान्वयन को देखें। यह 256 से कम इनपुट के लिए समान Integer वस्तु वापस करेगा।

संपादित करें:

यह वास्तव में -128 से +127 डिफ़ॉल्ट रूप से नीचे बताया गया है।