Probleme mit Autounboxing

Thomas Darimont

Erfahrenes Mitglied
Hallo!

Wie ihr ja, sicherlich schon wisst gibt's ja seit Java 5.0 einige neue Methoden in den
Wrapperklassen (Integer, Long,...) für die primitiven Typen wie (int, long,...).

in Form eines kleinen Caches für Werte -127 > x < 128:

Code:
...
static final Integer cache[] = new Integer[-(-128) + 127 + 1];static { for(int i = 0; i < cache.length; i++) cache[i] = new Integer(i - 128);}
...

Nun gibt's damit jedoch Probleme mit einem neuen Feature von Java 5.0 namens
Autounboxing.


Folgendes Programm:
Code:
/*
 * Created on 21.01.2005@18:36:53
 *
 * TODO Licence info
 */
package de.tutorials;

/**
 * @author Darimont
 * 
 * TODO Explain me
 */
public class Main {

	public static void main(String[] args) {
		
		Integer i1 = 32;
		Integer j1 = 32;
		Integer i2 = 320;
		Integer j2 = 320;
		
		System.out.println(i1 == j1);
		System.out.println(i2 == j2);

	}
}

ergibt dekompiliert:
Code:
// Decompiled by DJ v3.6.6.79 Copyright 2004 Atanas Neshkov  Date: 21.01.2005 18:34:14
// Home Page : http://members.fortunecity.com/neshkov/dj.html  - Check often for new version!
// Decompiler options: packimports(3) 
// Source File Name:   Main.java

package de.tutorials;

import java.io.PrintStream;

public class Main
{

    public Main()
    {
    }

    public static void main(String args[])
    {
        Integer i1 = Integer.valueOf(32);
        Integer j1 = Integer.valueOf(32);
        Integer i2 = Integer.valueOf(320);
        Integer j2 = Integer.valueOf(320);
        System.out.println(i1 == j1);
        System.out.println(i2 == j2);
    }
}

Als Ausgabe erhält man:
true
false

Jetzt ist die Frage, was sich sun bei einem solchen Verhalten gedacht hat,
Performance Optimierungen?

Lange rede kurzer Sinn ...Man sollte also "vorsichtigst" mit den neuen Features umgehen ... ;-)

Gruß Tom
 
Hallo,
intressant zu wissen :)

Jetzt ist die Frage, was sich sun bei einem solchen Verhalten gedacht hat,
Performance Optimierungen?

Hab mich grad mal bischen informiert drüber:

Memory usage will increase tremendously: Another issue concerning inexperienced developers. A newbie might think "Why should I use some weird int[] numbers = new int[x] when I could use a more flexible List<Integer> numbers = new ArrayList<Integer>(x);?". Well... one the main reason is the fact, that the latter version will use up way more memory than the former one. In the worst case, it could mean a 400 % increase over the array solution (why 400%? An Integer object will use 16 bytes of memory, which is four times the 4 bytes that the int value would use.
Siehe dazu auch
http://www.jroller.com/comments/murphee/Weblog/autoboxing_incorrectly_implemented

Von daher find ichs ganz nützlich ein Aliasing zu implementieren, wenn man zwei
Integer Objekte mit demselbem Wert unter Verwendung von Autoboxing kreiren
möchte.
Wann vergleicht schonmal jemand auf Referenzen?

Gruß

RedWing
 
Zurück