पाठ 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 मानों की तुलना) हमेशा सही है।