er Javas automatiske konvertering mellom (, ) og deres (, ). Det er praktisk, men har subtile fallgruver — ytelseskostnader, overraskende -oppførsel, og risiko for .
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
Det skjer automatisk fordi samlinger og generics krever objekter (du kan ikke ha List<int>), så Java boxer primitiver transparente.
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
Dette er lumsk: == på Integer fungerer for små verdier (cachet), men mislykkes for store — kode som virker korrekt i testing bryter i produksjon. Bruk alltid .equals() for sammenlikning av wrapper-verdier, eller unbox til primitiver først.
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 av en null-wrapper kaster en NPE — en vanlig, overraskende krasj, spesielt med søk i map som returnerer 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
Gjentagende boxing/unboxing opprettet for mange objekter, noe som skader ytelsen i tette løkker.
Autoboxing er praktisk og utbredt (samlinger, generics er helt avhengig av det), men dets fallgruver forårsaker reelle, vanskelig-å-diagnostisere feil.
==-fellen er spesielt farlig: sammenligning av Integer med == fungerer for cachet små verdier (-128 til 127), men mislykkes stille for større — en feil som passerer tester og bryter i produksjon — noe som gjør .equals() (eller unboxing) essensielt for wrapper-sammenlikning. NullPointerExceptions fra unboxing av null-wrappere (vanlig med map-søk) er en annen hyppig krasj.
Og boxing i varme løkker skaper unødvendige objekter, noe som skader ytelsen.
Å forstå når boxing skjer, verdien-mot-referanse-sammenligningspørsmålet, null-unboxing-risikoen, og bruke primitiver i ytelseskritisk kode er viktig for å skrive korrekt, effektiv Java — og Integer-cache ==-oppførsel er et klassisk intervjuspørsmål som avslører dyp forståelse.