Différence entre la conversion en String et String.valueOf

88

Quelle est la différence entre

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

et

Object foo = "something";
String bar = (String) foo;
Abandonner
la source
17
Euh, ce ne sont pas les mêmes ... du tout.
Perception

Réponses:

148

La conversion en chaîne ne fonctionne que lorsque l'objet est en fait une chaîne:

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

Cela ne fonctionnera pas lorsque l'objet est autre chose:

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

String.valueOf()cependant essaiera de convertir tout ce que vous y passez en un fichier String. Il gère à la fois les primitives ( 42) et les objets ( new Integer(42), en utilisant cet objet 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"

Notez en particulier le dernier exemple: passer nullà String.valueOf()retournera la chaîne "null".

Joachim Sauer
la source
13
@AdamStelmaszczyk: Je doute qu'il y en ait qui soit pertinent. Peut-être que la diffusion est légèrement plus rapide, mais les autres différences (gestion des nuls, capacité à gérer d'autres types) sont simplement beaucoup plus importantes que toute différence de performance mineure qui pourrait exister.
Joachim Sauer
3
Pour pousser un peu plus cette question, y a-t-il une différence significative entre appeler String.valueOf()et obj.toString()? (Le premier qui me vient à l'esprit est que obj.toString(), grâce à une exception, si objest nul.)
Kevin
3
@Kevin: pour les types de référence (aka "objets"), la seule différence est ce qui se passe avec null. Si vous regardez l'implémentation de String.valueOf()dans votre JDK, vous verrez que tout ce qu'il fait pour les références non nulles est d'appeler toString().
Joachim Sauer
@JoachimSauer J'ai toujours pensé que String.valueOf()c'était plus élégant qu'un casting. Mais si String.valueOf()tout ce que fait le casting, et plus, y a-t-il des raisons pour lesquelles on choisirait d'utiliser un casting? Pourquoi n'a-t-il pas été abandonné?
Shahid M Zubair
1
@silver: En effet, j'ai trop simplifié. String.valueOf((Object) null)renverra la chaîne "null". L'appeler avec un littéral nullappellera String # valueOf (char []) qui jette en fait un NPE lorsque vous passez null.
Joachim Sauer
19

String.valueOf(foo)invoque la méthode de foo.toString() et affecte le résultat à la barre . Il s'agit d'une opération sûre de type null.

La diffusion affectera simplement foo à la barre , si les types correspondent. Sinon, l'expression lancera un ClassCastException.

Darijan
la source
5
+1 Pour expliquer qui String.valueOf(Object)invoqueObject.toString()
Ryan Amos
4

Les deux génèrent la même sortie en cas de String.

Casting échoue si l'objet fourni n'est pas un string.

Suresh Atta
la source
2

La diffusion signifie que l'objet doit être de type String, alors qu'il String.valueOf()peut également prendre d'autres types.

tstorms
la source
2

La méthode String.valueOf est utilisée pour obtenir la représentation String de son objet paramètre.

La valeur (String) convertit la valeur de l'objet en chaîne.

Vous pouvez utiliser la méthode String.valueOf pour obtenir la représentation String d'un objet sans vous soucier des références nulles. Si vous essayez de convertir String sur une référence nulle, vous obtiendrez une NullPointerException.

Syamantak Basu
la source
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");

Sortie :strCastOfObj is null

Zaki
la source
0

Le premier c'est-à-dire, String.valueOfrenvoie une chaîne uniquement si l'objet est un type représentable qui est un type valeur ou une chaîne. Sinon, il lève l'exception.

Dans ce dernier, vous effectuez directement un casting qui peut échouer si l'objet n'est pas une chaîne.

Exemple en ligne.

http://ideone.com/p7AGh5

Sri Harsha Chilakapati
la source
Quel type d'exception?
Yousha Aleayoub
0

dans String.valueOf (); string as work transtypage de tous les arguments passés dans la méthode valueof () convertis en String et tout comme integer.string () convertit un entier en chaîne uniquement

anuragsingh
la source