Integer.valueOf ou new Integer ?

En lançant les tests via l'outil sonar sur un projet, une règle a été mise en évidence : il est conseillé d'utiliser la méthode Integer.valueOf de façon préférentielle au constructeur new Integer (pour permettre une meilleur gestion de la mémoire). Pourquoi cela est-il préconisé ?

En regardant le code source du JDK, on remarque une particularité de la classe Integer. Elle dispose d'un système de cache d'instances.

Ce cache est initialisé de façon statique au chargement de la classe.

Les comportements sont le suivants :

  • à chaque utilisation de new Integer une nouvelle instance de Integer est créée.
  • à chaque appel de Integer.valueOf un nouvelle instance peut être créée ou une instance est récupérée depuis le cache des Integer (classe interne Integer.IntegerCache). Pour entrer dans ce second cas, la il faut remplir les conditions suivantes :
  • - utiliser la méthode ayant une signature int (Integer.valueOf(int)),
    - utiliser une valeur du paramètre int comprise entre [-128, 127].

Pour illustrer cet fonctionnalité, voici un petit exemple :

public class TestNumeric {

@Test
public void testIntegerCache() {
Integer int1 = new Integer(123);
Integer int2 = Integer.valueOf(123);
Integer int3 = Integer.valueOf(123);

System.out.println("int1 == int2 : " + (int1 == int2));
System.out.println("int2 == int3 : " + (int2 == int3));
System.out.println("int1 == int3 : " + (int1 == int3));

int1 = new Integer(1234);
int2 = Integer.valueOf(1234);
int3 = Integer.valueOf(1234);

System.out.println("int1 == int2 : " + (int1 == int2));
System.out.println("int2 == int3 : " + (int2 == int3));
System.out.println("int1 == int3 : " + (int1 == int3));
}
}

L'affichage est :

int1 == int2 : false
int2 == int3 : true
int1 == int3 : false

int1 == int2 : false
int2 == int3 : false
int1 == int3 : false

Dans le premier cas, on voit que new Integer créé bien une nouvelle instance, mais pas Integer.valueOf ; dans le second cas, new Integer créé bien une nouvelle instance (ce qui est attendu) et Integer.valueOf aussi !!!

A ce lien vous pourrez trouver une étude comparative au niveau du temps d'éxécution.
http://tech.puredanger.com/2007/02/01/valueof/

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Captcha *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.