Το είναι η αυτόματη μετατροπή της Java μεταξύ (, ) και των (, ). Είναι βολικό αλλά έχει λεπτές παγίδες — overhead απόδοσης, εκπληκτική συμπεριφορά και κίνδυνο .
intdoubleIntegerDouble==NullPointerExceptionInteger boxed = 42; // autoboxing: int → Integer (Integer.valueOf(42))
int unboxed = boxed; // auto-unboxing: Integer → int (boxed.intValue())
List<Integer> nums = new ArrayList<>();
nums.add(5); // autoboxes int 5 → Integer (collections need objects)
int x = nums.get(0); // auto-unboxes Integer → int
Συμβαίνει αυτόματα επειδή τα collections και generics απαιτούν objects (δεν μπορείς να έχεις List<int>), οπότε η Java κάνει boxing primitives διαφανώς.
Integer a = 1000;
Integer b = 1000;
a == b; // ❌ FALSE — different Integer OBJECTS (reference comparison)
a.equals(b); // ✅ true — value comparison
// the WORSE trap — the Integer cache makes small values seem to work:
Integer c = 100, d = 100;
c == d; // TRUE — Java CACHES Integers from -128 to 127 (same object)
Integer e = 200, f = 200;
e == f; // FALSE — outside the cache range → different objects
Αυτό είναι δολερό: το == σε Integer λειτουργεί για μικρές τιμές (ενταμιευμένες) αλλά αποτυγχάνει για μεγάλες — κώδικας που φαίνεται σωστός στις δοκιμές σπάει στην παραγωγή. Χρησιμοποιούν πάντα .equals() για σύγκριση τιμών wrapper ή unbox πρώτα σε primitives.
Integer value = null; // a wrapper can be null
int x = value; // 💥 NullPointerException — unboxing null calls null.intValue()
Map<String, Integer> map = new HashMap<>();
int count = map.get("missing"); // 💥 NPE — get() returns null, then unboxing fails
Το unboxing ενός null wrapper ρίχνει μια NPE — ένα συνηθισμένο, εκπληκτικό crash, ιδιαίτερα με αναζητήσεις χάρτη που επιστρέφουν null.
// ❌ autoboxing in a hot loop — creates millions of Integer objects (GC pressure, slow)
Long sum = 0L; // WRONG type — wrapper
for (long i = 0; i < 1_000_000; i++) {
sum += i; // unbox, add, re-box → new Long each iteration!
}
// ✅ use primitives in hot paths
long sum = 0L; // primitive — no boxing
Το επαναλαμβανόμενο boxing/unboxing δημιουργεί περισσότερα objects, βλάπτοντας την απόδοση σε tight loops.
Το Autoboxing είναι βολικό και παντού (τα collections, generics εξαρτώνται από αυτό), αλλά οι παγίδες του προκαλούν πραγματικά, δύσκολα διάγνωσης bugs.
Η παγίδα == είναι ιδιαίτερα επικίνδυνη: η σύγκριση Integer με == λειτουργεί για ενταμιευμένες μικρές τιμές (-128 έως 127) αλλά αποτυγχάνει σιωπηλά για μεγαλύτερες — ένα bug που περνά τις δοκιμές και σπάει στην παραγωγή — κάνοντας το .equals() (ή unboxing) απαραίτητο για σύγκριση wrapper. Τα NullPointerExceptions από το unboxing των null wrappers (συνηθισμένο με αναζητήσεις χάρτη) είναι ένα άλλο συχνό crash.
Και το boxing σε hot loops δημιουργεί περιττά objects, βλάπτοντας την απόδοση.
Η κατανόηση του πότε συμβαίνει boxing, το πρόβλημα σύγκρισης τιμής έναντι αναφοράς, ο κίνδυνος null-unboxing και η χρήση primitives σε κώδικα κρίσιμο για την απόδοση είναι σημαντική για τη γραφή σωστής, αποτελεσματικής Java — και η συμπεριφορά Integer-cache == είναι μια κλασική ερώτηση συνέντευξης που αποκαλύπτει βαθιά κατανόηση.