HTML

Progmat

Utolsó kommentek

Mindennapi kódsoraink

2010.01.18. 14:24 Imeron

int-Integer dobozolás (boxing) probléma

Címkék: java érdekesség dobozolás

A Java egy viszonylag egyszerű és könnyen használható nyelv. Ennek ellenére programozás során könnyen bele lehet futni furcsa dolgokat produkáló kódba. A következő példa jól mutatja, hogy milyen veszélyeket rejt, ha nem minden esetben követjük a nyelv íratlan szabályait. A specifikáció apró részleteiről, illetve a fordító/futtató környezet apróságairól már jobb nem is beszélni.

A következő kódrészlet az int-Integer autoboxing-ot (dobozolás) mutatja be. Az int számok átkonvertálása Integer-ré elég költséges dolog. Amikor pedig többszörös konverziót hajtunk végre vagy egy hosszú ciklusban használunk ilyesmit akkor érezzük magunkat rosszul. A dobozolás egy lassú folyamat.

A következő kódrészlet egy egyszerű dobozolási példát mutat be. A kérdés, hogy mit ír ki?

Integer i1 = 100;
Integer i2 = 100;

Integer i3 = 2000;
Integer i4 = 2000;

if (i1 == i2) {
   System.out.println("i1 es i2 megegyezik.");
}

if (i3 == i4) {
   System.out.println("i3 es i4 megegyezik.");
}

A nyelv fejlesztői tisztában voltak azzal, hogy a dobozolás nincs ingyen; ezért is alkalmaztak gyorsítást. Ennek az a lényege, hogy -128 és alapesetben 127 között az int Integer-ré alakítása során már előre legyártott értékeket ad vissza a dobozoló. Így már érthető lesz a programrészlet fura kimenete. Tehát aki arra tippelt, hogy az "i1 es i2 megegyezik" jelenik meg a kimeneten az jutalmul megnézheti az anomáliát előidéző kódrészletet az Integer osztályból:

public static Integer valueOf(int i) {
   if(i >= -128 && i <= IntegerCache.high)
      return IntegerCache.cache[i + 128];
   else
      return new Integer(i);
}

Tanulság: két objektum egyezőségének vizsgálatára mindig az equals() függvényt használjuk, sose az objektumok esetében csak referenciák összehasonlítására szolgáló '==' jelet.

2 komment

A bejegyzés trackback címe:

https://progmat.blog.hu/api/trackback/id/tr841681954

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

PokMajom 2010.01.19. 15:56:06

Látom lazább lett az időbeosztás ;)

Imeron 2010.01.20. 08:40:02

@PokMajom: Hehe. Igy is mondhatjuk :)
süti beállítások módosítása