जब आप एक नंबर जावा में शाब्दिक संकलन और एक पूर्णांक (राजधानी I
) संकलक का उत्सर्जन करता है के लिए असाइन करें:
Integer b2 =Integer.valueOf(127)
कोड की यह पंक्ति भी उत्पन्न होता है जब आप autoboxing का उपयोग करें।
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)
बी 2, बी 3 के सभी तर्कसंगत बराबर मानों के लिए सच प्रिंट करेगा।
ध्यान दें कि इंटीजर कैश प्रदर्शन कारणों से नहीं है, बल्कि JLS, section 5.1.7 के अनुरूप है; ऑब्जेक्ट पहचान मानों के लिए -128 से 127 समावेशी के लिए दी जानी चाहिए।
Integer#valueOf(int) भी इस व्यवहार दस्तावेजों:
इस विधि अक्सर अनुरोध किया मूल्यों कैशिंग द्वारा काफी बेहतर स्थान और समय प्रदर्शन उपज की संभावना है। इस विधि हमेशा रेंज -128 को 127, समावेशी में मूल्यों कैश जाएगा, और इस सीमा के बाहर अन्य मूल्यों को संचित कर सकता।
आप http://bexhuff.com/2006/11/java-1-5-autoboxing-wackyness जानकारीपूर्ण मिल सकती है। –
इस सवाल से पूछने के लिए आप कैसे गए थे? यह वास्तव में मजेदार है, लेकिन कोई भी "वास्तविक दुनिया में" जैसे किसी चीज़ पर कभी नहीं आता है ... या? –
http://stackoverflow.com/a/11882284/57695 –