, Java'nın (, ) ile bunların (, ) arasındaki otomatik dönüşümüdür. Uygun olsa da ince tuzakları vardır — performans yükü, şaşırtıcı davranışı ve riski.
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
Koleksiyonlar ve generics nesneler gerektirdiği için otomatik olarak gerçekleşir (you can't have List<int>), bu nedenle Java primitiveleri şeffaf bir şekilde box'lar.
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
Bu sinsi bir sorundur: Integer üzerinde == küçük değerler (cache'lenmiş) için çalışır ancak büyük olanlar için başarısız — testlerde doğru görünen kod üretimde bozulur. Wrapper değer karşılaştırması için her zaman .equals() kullanın veya önce primitivelere unbox edin.
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
Bir null wrapper'ı unboxing etmek NPE fırlatır — özellikle null döndüren harita aramaları ile sık görülen, şaşırtıcı bir crash.
// ❌ 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
Tekrarlanan boxing/unboxing aşırı nesneler oluşturur ve sıkı döngülerde performansı kötüleştirir.
Autoboxing uygun ve yaygındır (koleksiyonlar, generics hepsi buna dayanır), ancak tuzakları gerçek, tanılanması zor hatalar nedenidir.
== tuzağı özellikle tehlikelidir: Integer'ları == ile karşılaştırırken cache'lenmiş küçük değerler (-128 ile 127) için çalışır ancak daha büyük olanlar için sessizce başarısız olur — testleri geçen ancak üretimde bozulan bir hata — wrapper karşılaştırması için .equals() (veya unboxing) gerekli kılar. Unboxing null wrapper'larından gelen NullPointerExceptions (harita aramaları ile yaygın) başka bir sık crash'tir.
Ve hot loop'larda boxing gereksiz nesneler oluşturur ve performansı kötüleştirir.
Boxing'in ne zaman gerçekleştiği, değer-ve-referans karşılaştırma sorunu, null-unboxing riski ve performans açısından kritik kodda primitifleri kullanma anlamak, doğru ve verimli Java yazmak için önemlidir — ve Integer-cache == davranışı, derin anlayışı ortaya koyan klasik bir mülakat sorusudur.