Integerवर्ग कि दुकानों 256 विशेष एक स्थिर कैश है, Integerमन में -128 और 127 कि साथ के बीच हर मूल्य के लिए एक, इन तीन के बीच अंतर पर विचार - वस्तुओं।
new Integer(123);
यह (स्पष्ट रूप से) एक बिल्कुल नई Integerवस्तु बनाता है ।
Integer.parseInt("123");
intपार्स करने के बाद यह एक आदिम मान लौटाता है String।
Integer.valueOf("123");
यह दूसरों की तुलना में अधिक जटिल है। यह पार्स करने से शुरू होता है String। फिर, यदि मान -128 और 127 के बीच है, तो यह स्थैतिक कैश से संबंधित वस्तु को लौटाता है। यदि मान इस सीमा के बाहर है, तो यह इनवोक करता हैnew Integer() मूल्य में और गुजरता है, जिससे आपको एक नई वस्तु मिलती है।
अब, प्रश्न में तीन अभिव्यक्तियों पर विचार करें।
Integer.valueOf("127")==Integer.valueOf("127");
यह सही है, क्योंकि Integerजिसका मूल्य 127 है वह स्थैतिक कैश से दो बार प्राप्त होता है, और स्वयं की तुलना में। इसमें केवल एक ही Integerवस्तु शामिल है, इसलिए यह रिटर्न करता है true।
Integer.valueOf("128")==Integer.valueOf("128");
यह रिटर्न false, क्योंकि 128 स्थैतिक कैश में नहीं है। तो Integerसमानता के प्रत्येक पक्ष के लिए एक नया बनाया जाता है। चूंकि दो अलग-अलग Integerवस्तुएं हैं, और ==वस्तुओं के लिए केवल तभी लौटता है trueजब दोनों पक्ष एक ही वस्तु हों, यह होने जा रहा है false।
Integer.parseInt("128")==Integer.valueOf("128");
यह दाईं ओर intएक नव निर्मित Integerवस्तु के साथ, बाईं ओर के आदिम मूल्य 128 की तुलना कर रहा है । लेकिन क्योंकि यह एक तुलना करने के लिए मतलब नहीं है intएक करने के लिए Integer, जावा ऑटो Unbox जाएगा Integerतुलना करने से पहले; तो आप एक की तुलना अंत intएक करने के लिए int। चूंकि आदिम 128 स्वयं के बराबर है, इसलिए यह रिटर्न करता है true।
.equals(), अन्यथा सभी दांव बंद हैं।