पाठ 9 / 38
रैपर क्लास व ऑटोबॉक्सिंग
हर प्रिमिटिव के ऑब्जेक्ट रैपर से मिलें, देखें ऑटोबॉक्सिंग/अनबॉक्सिंग कैसे अपने-आप बदलते हैं, और बॉक्स्ड Integer के साथ == के क्लासिक जाल को समझें।
हर प्रिमिटिव के लिए एक रैपर
int→Integer, double→Double, boolean→Boolean, char→Character आदि। रैपर पूर्ण ऑब्जेक्ट हैं: ये null हो सकते हैं, कलेक्शन में रखे जा सकते हैं (जो सिर्फ़ ऑब्जेक्ट रखते हैं), और Integer.MAX_VALUE, Integer.parseInt(...) जैसे उपयोगी स्टैटिक्स रखते हैं।
ऑटोबॉक्सिंग व अनबॉक्सिंग
कम्पाइलर ज़रूरत पड़ने पर प्रिमिटिव ↔ रैपर को चुपचाप बदलता है — जैसे List<Integer> में डालते या निकालते समय। सुविधाजनक है, पर हर बॉक्सिंग एक ऑब्जेक्ट बनाती है, जो टाइट लूप में मायने रखता है।
List<Integer> nums = new ArrayList<>();
nums.add(5); // autobox: int -> Integer
int first = nums.get(0); // unbox: Integer -> int
Integer boxed = null;
// int bad = boxed; // NullPointerException at unboxing!Integer == का जाल
Java बॉक्स्ड Integer मानों को -128 से 127 तक कैश करता है, इसलिए छोटे मान संयोग से == से बराबर मिल सकते हैं जबकि बड़े नहीं। यह एक implementation डिटेल है, गारंटी नहीं — रैपर तुलना के लिए हमेशा .equals() (या int में अनबॉक्स) उपयोग करें।
Integer a = 100, b = 100;
System.out.println(a == b); // true (cached)
Integer x = 200, y = 200;
System.out.println(x == y); // false (not cached!)
System.out.println(x.equals(y)); // true — always correctत्वरित जाँच
त्वरित जाँच: दो Integer ऑब्जेक्ट के बराबर मान की सबसे सुरक्षित तुलना कैसे करें?
- Integer के लिए == हमेशा काम करता है
- .equals(), या पहले दोनों को int में अनबॉक्स करें
- सिर्फ़ compareTo(), कभी equals() नहीं
- इनकी तुलना कभी नहीं हो सकती
Answer
.equals(), या पहले दोनों को int में अनबॉक्स करें — == रेफ़रेंस तुलना करता है और सिर्फ़ छोटे कैश्ड दायरे (-128..127) में संयोग से सही काम करता है। .equals() (या प्रिमिटिव int मानों की तुलना) हमेशा सही है।