2009-11-25 3 views

Répondre

4

Aucun, jetez un oeil à Integer.java:

public static Integer valueOf(String s) throws NumberFormatException { 
    return new Integer(parseInt(s, 10)); 
} 

En outre, le JavaDoc

+0

Bien qu'il soit étrange de noter qu'il existe une différence entre ceci et Integer.valueOf (Integer.parseInt (s)) ... pour une raison étrange, valueOf (String) ne se répète pas en valueOf (int) qui a quelques la mise en cache d'instance intégrée. Bizarre. – PSpeed

+0

S'il n'y a pas de différence alors pourquoi y aurait-il deux façons? – Rohit

+0

ils ont une petite différence – SjB

1

En regardant le code source, nous pouvons dire qu'il n'y a pas de différence.

Le premier crée un nouvel entier en utilisant le constructeur explicitement.

Ce dernier crée un entier à l'aide d'une méthode usine (qui appelle le constructeur).

Le fait que le deuxième appelle la première, est un détail de mise en œuvre et pas nécessairement vrai dans toutes les mises en œuvre, dans certains cas, il ne peut pas appeler le constructeur, mais utiliser un cache (comme dans valueOf(int i))

Le Entier résultant se comporte exactement le même dans les deux cas.

Pourtant, rien ne l'empêche de changer la seconde à:

public static Integer valueOf(String s, int radix) throws NumberFormatException { 
     return valueOf(parseInt(s, radix));// which uses the cache 
} 

Ce changement peut être effectué dans la prochaine version (ou peut-être une machine virtuelle fait de cette façon) et votre code serait obtenir « automatiquement » dans la mise à niveau, tandis que d'un autre côté, en utilisant le constructeur vous ne pouvez pas, car bien, vous appelez le constructeur explicitement.

2

L'utilisation de new exige très clairement la création d'un nouvel objet pour chaque occurrence. L'utilisation du modèle d'usine (valueOf) donne une chance à l'implémentation (qu'elle n'a pas nécessairement acceptée) de fournir à la place une instance déjà créée à partir du cache.

J'ai entendu une certaine mise en œuvre mettre en cache les 100 premiers entiers ou plus parce qu'ils se produisent assez souvent pour que cela soit payant.

Le cas où cela est le plus utile est avec Boolean. Nous SAVONS qu'il n'y a que deux valeurs distinctes possibles, donc valueOf retourne toujours l'un de ces deux sans la surcharge de créer un nouvel objet. L'utilisation de new avec Boolean est légale mais entraînera toujours un surcoût en termes de performances et d'utilisation de la mémoire.

+0

Vous avez manqué FILE_NOT_FOUND dans votre exemple booléen (http://thedailywtf.com/Articles/What_Is_Truth_0x3f_.aspx) – spork

Questions connexes