Diferencia entre Largo.valueOf (java.lang.String) y new Long (java.lang.String)?


Estoy consolidando el código escrito por dos personas diferentes y notar que la fundición de un valor de cadena en un Largo se ha hecho de dos maneras diferentes.

El codificador #1 ha hecho esto:

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

Mientras que el codificador #2 ha hecho esto:

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

Funcionalmente, el código funciona exactamente igual. Hay un bloque try/catch alrededor de cada bit para manejar cualquier NumberFormatException que se lance. El valor de la cadena entrante es una cadena de 8 dígitos que representa un decimal: "12345678" y en ambos casos es correctamente convertido en Long.

Hay alguna diferencia funcional entre pasar la cadena en el constructor y usar Long.valueOf()? He comprobado el constructor doc aquí:

Long (java.lang.String)

Y los documentos para valueOf() aquí:

Largo.valueOf (java.lang.String)

Por lo que puedo decir, ambos llaman parseLong() por lo que no importa cuál se use. Sólo quiero asegurarme de que no me estoy preparando para un comportamiento extraño más abajo en la carretera. Además, ¿es cualquiera de los estilos más "correcto" (jaja) que el otro?

Author: Martin Vseticka, 2012-10-30

6 answers

La diferencia es que usando new Long() siempre creará un nuevo objeto, mientras usa Long.valueOf(), puede devolverle el valor en caché de long si el valor está entre [-128 to 127].

Entonces, deberías preferir el método Long.valueOf, porque puede ahorrarte algo de memoria.

Si ves el código fuente de Long.valueOf(String), internamente invoca Long.valueOf(long), cuyo código fuente he publicado a continuación: -

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);
}
 25
Author: Rohit Jain,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-22 12:25:50

Long.valueOf() debería preferirse: devuelve valores en caché de largo para algunos valores de uso frecuente en lugar de construir una nueva instancia como lo hace el constructor.

Incluso si algunas versiones de Java no usan caché, usar valueOf() lo hace posible en futuras versiones, mientras que el constructor siempre creará una nueva instancia.

 8
Author: JB Nizet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-30 18:27:41

Significan lo mismo

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);
}

Fuente JDK 6.0

 3
Author: Arun Manivannan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-30 18:25:26

Ambos hacen parseLong(String, int) internamente (int siendo radix con valor como 10), pero valueOf tiene ventaja como se documenta a continuación:

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
Author: Yogendra Singh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-30 18:29:59

Este es el plugin PMD out put que se ejecuta en eclipse

El código que comprobé es

Long l = new Long("123456");

En JDK 1.5, llamar a new Long() causa asignación de memoria. Largo.valueOf () es más amigable con la memoria.

 0
Author: Suranga,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-30 18:23:47

Estoy pensando en cómo cambiar el rango y el tamaño de la caché para nuestra aplicación, sobrecargada de Longs;

Dicho cambio no es compatible con la api j2se Una forma es cambiar el código de bytes java cargado con ClassLoader o incluso con JVMTI (permite mantener tal truco fuera del proyecto, como la sintonización externa)

O, puede ser, para crear caché externa y propia estática cachedValueOf() lo cual es sencillo, pero el código dependiendo de algunas necesidades no aplicables no es agradable

 0
Author: Yegor Parusymov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-22 10:46:38