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;
Abandonar
fuente
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".

Joachim Sauer
fuente
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.

darijan
fuente
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.

Suresh Atta
fuente
2

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

tormentas
fuente
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.

Syamantak Basu
fuente
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

Zaki
fuente
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

Sri Harsha Chilakapati
fuente
¿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

anuragsingh
fuente