yra Java automatinis konvertavimas tarp (, ) ir jų (, ). Tai patogu, bet turi subtilių pavojų — našumo nuostoliai, netikėtas elgesys ir rizika.
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
Tai vyksta automatiškai, nes kolekcinės ir generikai reikalingi objektus (negalite turėti List<int>), todėl Java skaidytai supakuoja primityvus.
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
Tai yra paslaptinga: == Integer objektams veikia mažoms reikšmėms (kurios yra cache), bet nepavyksta didelėms — kodas, kuris atrodo teisingas testuojant, sugenda darboje. Visada naudokite .equals() wrapper reikšmės palyginimui arba iš pradžių rozpakuokite primityvus.
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
Rozpakavus null wrapper, iškyla NPE — bendra, netikėta strigis, ypač su žemėlapio ieškojimais, kurie grąžina 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
Dažnas supakavimas/rozpakavimas sukuria per daug objektų, žalingas našumui griežtuose cikluose.
Autoboxing yra patogus ir plačiai paplitęs (kolekcinės, generikai, jie visi remiasi juo), bet jo pavojai sukelia tikrus, sunkiai diagnozuojamus klaidas.
== spąstai yra ypač pavojingi: Integer lyginimas su == veikia cache turint mažas reikšmes (-128 iki 127), bet tyliai nepavyksta didelėms — klaida, kuri praeina testus ir sugenda darboje — todėl .equals() (arba rozpakavimas) yra būtinas wrapper palyginimui. NullPointerExceptions iš null wrapper rozpakavimo (dažna su žemėlapio ieškojimais) yra dar vienas dažnas žlugimas.
Ir supakavimas karštuose cikluose sukuria nereikalingus objektus, žalingas našumui.
Supratimas, kada vyksta supakavimas, vertės ir nuorodos palyginimo problema, null rozpakavimo rizika ir primityvių naudojimas našumui kritiškame kode yra svarbus teisingam, efektyviam Java kodui — ir Integer cache == elgesys yra klasikinis pokalbio klausimas, kuris atskleidžia gilų supratimą.