जब आप जावा में एक संख्या शाब्दिक संकलित करते हैं और इसे एक पूर्णांक (राजधानी I
) में संकलित करते हैं, तो संकलक निकलता है:
Integer b2 =Integer.valueOf(127)
जब आप ऑटोबॉक्सिंग का उपयोग करते हैं तो कोड की यह लाइन भी उत्पन्न होती है।
valueOf
इस तरह लागू किया जाता है कि कुछ निश्चित संख्याएं "जमा" होती हैं, और यह 128 से छोटे मूल्यों के लिए एक ही उदाहरण देता है।
जावा 1.6 स्रोत कोड से, लाइन 621:
public static Integer valueOf(int i) {
if(i >= -128 && i <= IntegerCache.high)
return IntegerCache.cache[i + 128];
else
return new Integer(i);
}
का मान high
सकते हैं एक और मूल्य के लिए कॉन्फ़िगर किया, प्रणाली संपत्ति के साथ।
-Djava.lang.Integer.IntegerCache.high = 999
यदि आप उस सिस्टम प्रॉपर्टी के साथ अपना प्रोग्राम चलाते हैं, तो यह सच हो जाएगा!
स्पष्ट निष्कर्ष: कभी भी एक जैसे होने के दो संदर्भों पर भरोसा न करें, हमेशा उनकी तुलना .equals()
विधि से करें।
तो b2.equals(b3)
b2, b3 के सभी तार्किक समान मूल्यों के लिए सच प्रिंट होगा।
ध्यान दें कि Integer
कैश प्रदर्शन के कारणों के लिए नहीं है, बल्कि जेएलएस, खंड 5.1.7 के अनुरूप है ; ऑब्जेक्ट की पहचान -128-127 से लेकर इंक्लूसिव के लिए दी जानी चाहिए।
पूर्णांक # valueOf (int) भी इस व्यवहार का दस्तावेजीकरण करता है:
इस पद्धति से अक्सर अनुरोधित मूल्यों को कैशिंग द्वारा बेहतर स्थान और समय प्रदर्शन प्राप्त करने की संभावना है। यह विधि हमेशा -128-127 से लेकर 127 तक के मूल्यों को कैश कर सकती है, इस रेंज के बाहर अन्य मूल्यों को कैश कर सकती है।