Diferencia entre la conversión a String y String.valueOf


88

Cuál es la diferencia entre

Object foo = "something";
String bar = String.valueOf(foo);

y

Object foo = "something";
String bar = (String) foo;

17
Uh, no son lo mismo ... en absoluto.
Percepción

Respuestas:


148

La conversión a cadena solo funciona cuando el objeto en realidad es una cadena:

Object reallyAString = "foo";
String str = (String) reallyAString; // works.

No funcionará cuando el objeto sea otra cosa:

Object notAString = new Integer(42);
String str = (String) notAString; // will throw a ClassCastException

String.valueOf()sin embargo, intentará convertir todo lo que le pase en un archivo String. Maneja tanto primitivas ( 42) como objetos ( new Integer(42), usando ese objeto toString()):

String str;
str = String.valueOf(new Integer(42)); // str will hold "42"
str = String.valueOf("foo"); // str will hold "foo"
Object nullValue = null;
str = String.valueOf(nullValue); // str will hold "null"

Tenga en cuenta especialmente el último ejemplo: pasar nulla String.valueOf()devolverá la cadena "null".


13
@AdamStelmaszczyk: Dudo que haya alguno que sea relevante. Tal vez el lanzamiento sea un poco más rápido, pero las otras diferencias (manejo nulo, capacidad para manejar otros tipos) son significativamente más importantes que cualquier diferencia menor de rendimiento que pueda haber.
Joachim Sauer

3
Para impulsar esta pregunta un poco más, ¿hay alguna diferencia significativa entre llamar String.valueOf()y obj.toString()? (Lo primero que me viene a la mente es que se obj.toString()hará mediante una excepción si objes nulo).
Kevin

3
@Kevin: para los tipos de referencia (también conocidos como "objetos") la única diferencia es lo que sucede con null. Si observa la implementación de String.valueOf()en su JDK, verá que todo lo que hace para las referencias no nulas es llamar toString().
Joachim Sauer

@JoachimSauer Siempre pensé que String.valueOf()era más elegante que un elenco. Pero si String.valueOf()hace todo lo que hace el casting, y más, ¿hay alguna razón por la que uno elegiría usar un yeso? ¿Por qué no ha quedado obsoleto?
Shahid M Zubair

1
@silver: De hecho, simplifiqué demasiado. String.valueOf((Object) null)devolverá el String "nulo". Llamarlo con un literal nullllamará a String # valueOf (char []) que en realidad arroja un NPE cuando pasa null.
Joachim Sauer

19

String.valueOf(foo)invoca el método de foo.toString() y asigna el resultado a la barra . Es una operación nula y de tipo seguro.

El casting simplemente asignará foo a la barra , si los tipos coinciden. De lo contrario, la expresión arrojará un ClassCastException.


5
+1 por explicar que String.valueOf(Object)invocaObject.toString()
Ryan Amos

4

Ambos generan la misma salida en el caso de String.

Casting falla en caso de que el objeto proporcionado no sea un string.


2

La conversión significa que el objeto debe ser de tipo String, mientras que también String.valueOf()puede tomar otros tipos.


2

El método String.valueOf se utiliza para obtener la representación String de su objeto de parámetro.

(Cadena) valor convierte el valor del objeto en una cadena.

Puede utilizar el método String.valueOf para obtener la representación String de un objeto sin preocuparse por las referencias nulas. Si intenta convertir String en una referencia nula, obtendrá una NullPointerException.


1
final Object obj = null;
final String strValOfObj = String.valueOf(obj);
final String strCastOfObj = (String) obj;
if (strValOfObj == null) System.out.println("strValOfObj is null");
if (strCastOfObj == null) System.out.println("strCastOfObj is null");

Salida :strCastOfObj is null


0

El primero, es decir, String.valueOfdevuelve una cadena solo si el objeto es un tipo representable, que es un tipo de valor o una cadena. De lo contrario, lanza la excepción.

En el último, está emitiendo directamente, lo que puede fallar si el objeto no es una cadena.

Ejemplo en línea.

http://ideone.com/p7AGh5


¿Qué tipo de excepción?
Yousha Aleayoub

0

en String.valueOf (); cadena como trabajo de conversión de tipos todos los argumentos pasados ​​en el método valueof () convertir en String y al igual que integer.string () convertir entero en cadena solamente

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.