2011-01-21 17 views
8

Así que tengo una cadena y quiero crear un objeto doble con la cadena como valor.¿Cuál es la diferencia entre llamar Double.valueOf (String s) y new Double (String s)?

puedo llamar

Double myDouble = new Double (myString);

o puedo llamar

Double myDouble = Double.valueOf(myString);

¿Hay alguna diferencia? Supongo que las primeras garantías de que se crea un nuevo objeto en el montón y el segundo pueden reutilizar un objeto existente.

Para crédito adicional: la cadena podría ser nula , en cuyo caso, quiero que el doble para ser nula, pero tanto el tiro por encima de una NullPointerException. ¿Hay una manera de escribir

Double myDouble = myString == null ? null : Double.valueOf(myString);

en menos código?

+3

* ¿Cómo * quieres dar créditos extra? Estás limitado a * un * voto alternativo para cada respuesta ;-) –

+1

* Supongo que las primeras garantías de que se crea un nuevo objeto en el montón y el segundo pueden volver a usar un objeto existente.* adivinas correctamente :-) –

+2

@Andreas_D - Pensaba que tal vez se pagaron USD 1,000,000 en la cuenta de PayPal de alguien, pero tienes razón: el representante de Stack Overflow es mucho más valioso, por lo que retiro esa oferta; -] –

Respuesta

3

depende de la implementación. openJDK 6 b14 utiliza esta implementación de Double(String s):

this(valueOf(s).doubleValue()); 

Por lo tanto, las llamadas valueOf(String s) interna y debe ser menos eficiente en comparación con llamar a ese método directamente.

+1

Aceptando esta respuesta porque comienza con la frase "Depende de la implementación", lo que parece de las otras respuestas es realmente el caso. –

3

Su suposición es correcta. La segunda forma de obtener un doble de cadena puede ser más rápido porque el valor puede ser devuelto desde un caché.

En cuanto a la segunda pregunta, puede crear un método seguro nulo de ayuda que devolvería un valor nulo en lugar de arrojar NullPointerException.

+0

Subida al precio respondiendo la pregunta de bonificación de crédito ;-) –

3

de Apache

public static Double valueOf(String string) throws NumberFormatException { 
      return new Double(parseDouble(string)); 
} 

&

public Double(String string) throws NumberFormatException { 
      this(parseDouble(string)); 
} 

de Sun JDK [Oracle]

public Double(String s) throws NumberFormatException { 
    // REMIND: this is inefficient 
    this(valueOf(s).doubleValue()); 
    } 

&

public static Double valueOf(double d) { 
     return new Double(d); 
    } 
+0

¿Es este código fuente real de una implementación de JVM en particular? Podría ayudar a identificar cuál. –

+1

actualizado .................. –

2

ninguna diferencia en absoluto, al menos en Oracle JDK 1.6:

public Double(String s) throws NumberFormatException { 
// REMIND: this is inefficient 
this(valueOf(s).doubleValue()); 
} 
+1

La diferencia está en el comentario. valueOf() crea un objeto doble, el nuevo Double() crea dos. –

0

Si le preocupa el rendimiento, debe considerar el uso de una primitiva.

double myDouble = Double.parseDouble(myString); 
+0

Hace que sea más difícil pasar todos los valores nulos importantes. (¡No sugiera pasar NaN!) –

Cuestiones relacionadas