web-dev-qa-db-fra.com

Différence entre Long.valueOf (Java.lang.String) et nouveau Long (Java.lang.String)?

Je consolide le code écrit par deux personnes différentes et je remarque que la conversion d'une valeur de chaîne en un long a été effectuée de deux manières différentes.

Le codeur # 1 a fait ceci:

String strId = "12345678";
...
Long lId = new Long(strId);

Alors que le codeur # 2 l'a fait:

String strId = "12345678";
...
Long lId = Long.valueOf(strId);

Fonctionnellement, le code fonctionne exactement de la même manière. Il y a un bloc try/catch autour de chaque bit pour gérer tout NumberFormatException qui est lancé. La valeur de chaîne entrante est une chaîne de 8 chiffres qui représente une décimale: "12345678" et dans les deux cas, il est correctement converti en Long.

Y a-t-il une différence fonctionnelle entre passer la chaîne dans le constructeur et utiliser Long.valueOf ()? J'ai vérifié la documentation du constructeur ici:

Long (Java.lang.String)

et les documents pour valueOf () ici:

Long.valueOf (Java.lang.String)

Pour autant que je sache, ils appellent tous les deux parseLong () donc peu importe qui est utilisé. Je veux juste m'assurer que je ne me prépare pas à un comportement étrange plus loin. De plus, l'un ou l'autre style est-il plus "correct" (haha) que l'autre?

28
AWT

La différence est que en utilisant new Long() vous créerez toujours un nouvel objet, tout en utilisant Long.valueOf(), peut vous renvoyer la valeur en cache de long si la valeur est comprise entre [-128 to 127].

Donc, vous devriez préférer la méthode Long.valueOf, Car elle peut vous faire économiser de la mémoire.

Si vous voyez le code source de Long.valueOf(String), il appelle en interne Long.valueOf(long), dont j'ai publié le code source ci-dessous: -

public static Long valueOf(String s) throws NumberFormatException
{
    return Long.valueOf(parseLong(s, 10));
}

public static Long valueOf(long l) {
    final int offset = 128;
    if (l >= -128 && l <= 127) { // will cache 
        return LongCache.cache[(int)l + offset];
    }
    return new Long(l);
}
27
Rohit Jain

Long.valueOf() devrait être préféré: il retourne les valeurs mises en cache de Long pour certaines valeurs souvent utilisées au lieu de construire une nouvelle instance comme le fait le constructeur.

Même si certaines versions Java n'utilisent pas de cache, l'utilisation de valueOf() le permet dans les versions futures, tandis que le constructeur créera toujours une nouvelle instance.

8
JB Nizet

Les deux font parseLong(String, int) en interne (int étant radix avec une valeur de 10), mais valueOf a l'avantage comme indiqué ci-dessous:

If a new Long instance is not required, this method should generally be used in preference to the constructor Long(long), as this method is likely to yield significantly better space and time performance by caching frequently requested values.

3
Yogendra Singh

Ils signifient la même chose

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

public Long(String s) throws NumberFormatException {
    this.value = parseLong(s, 10);
}

Source JDK 6.

3
Arun Manivannan

Ceci est le plugin PMD qui est exécuté sur Eclipse

Le code que j'ai vérifié est

Long l = new Long("123456");

Dans JDK 1.5, l'appel de new Long () provoque l'allocation de mémoire. Long.valueOf () est plus convivial pour la mémoire.

0
Suranga

je pense comment changer la plage et la taille du cache pour notre application, surchargée de Longs;

une telle modification n'est pas prise en charge par j2se api Une façon consiste à modifier le code chargé Java octet avec ClassLoader ou même avec JVMTI (cela permet de garder une telle astuce hors du projet, comme le réglage externe)

ou, peut-être, pour créer un cache externe et posséder un cachedValueOf () statique qui est simple, mais le code en fonction de certains besoins non applicatifs n'est pas agréable

0
Yegor Parusymov