Java 1.5 Usar autoboxing o métodos valueOf para mejorar el rendimiento (Ventajas)

Java 1.5 vino con varias mejoras en el lenguaje. Entre ellas autoboxing y autounboxing. ¿Y para que sirve? si tienes que usar un objeto "wrapper" para meter enteros en una lista por ejemplo, en vez de usar new Integer(numero), usas directamente número. Entonces imaginemos que queremos meter 3 números en una lista, en Java 1.4 se haría así:

List lista = new ArrayList();

lista.add( new Integer( 1));
lista.add( new Integer( 2));
lista.add( new Integer( 3));

En Java 1.5 se haría así:

List <Integer> lista = new ArrayList<Integer>();

lista.add( 1);
lista.add( 2);
lista.add( 3);

El compilador se encarga de crear los objetos wrapper por uno.

Esta característica pareciera sólo cosmética, es decir, que sólo serviría para poner el código más bonito. Pero resulta que por dentro tiene una optimización.

Las clases wrapper en Java 1.5 ahora tienen unos métodos llamados valueOf. Que simplemente reciben un número y devuelven la clase wrapper correspondiente. Bueno resulta que cuando java hace autoboxing no usa los constructores (new Integer) sino los métodos valueOf. La ventaja de estos métodos es que guardan un caché de instancias de números más usados (-127..128). en general rara vez los números pasan de ese rengo. Como las clases wrapper son inmutables no importa tener la misma instancia para todos los Integer que representen el número 1. Así en vez de tener innumerables instancias de Integer que embasuren la memoria y enlentezcan el Garbage Collector(ya que en su mayoría son objetos que tienen muy corta vida) y que además todos representen el mismo número, se tenga una única instancia por cada número distinto.

En resumen, usar el autoboxing no sólo hace más sencillo el código, sino que además es más eficiente en cuanto al consumo de memoria se refiere.

Si no se quiere usar el autoboxing porque puede ser confuso, al menos deberían usarse los métodos valueOf. El código anterior quedaría así:

List <Integer> lista = new ArrayList<Integer>();

lista.add( Integer.valueOf( 1));
lista.add( Integer.valueOf( 2));
lista.add( Integer.valueOf( 3));
Hasta la próxima...

Nota: Si esta información te es de utilidad o piensas que se puede mejorar, por favor deja un comentario con tus observaciones.

3 comentarios:

  1. Interesante lo de la cache de los objetos wrappers. Sin duda me parecia bueno lo del autoboxing, porque reduce el esfuerzo de tipeo, pero lo del performance es excelente.

    ResponderEliminar
  2. Y solo hay que cambiar el hábito de usar new Integer y cambiarlo por Integer.valueOf

    ResponderEliminar
  3. Muy buen artículo Carlos,

    La verdad es que el Autoboxing puede resultar algo confuso al principio (curva de aprendizaje natural) pero una vez entiendes que está ocurriendo supone una limpieza de código, legibilidad del mismo, reducción de tiempo a la hora de programar y como bien dices un control por parte de Java para evitar un uso excesivo del operador new.

    Precisamente en un artículo que publicaré en unos días aparece una referencia a este artículo porque me ha parecido muy completo y la vez explicado de forma clara y sencilla.

    Te dejo una enlace a mi web por si estás interesado en consultar el artículo.

    http://programarenjava.com

    ResponderEliminar

- Comenta, comenta, adelante. Así nos animas a seguir el blog -

Búsqueda

CodeWeavers