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;

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".


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.


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.


2

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


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.


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


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


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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.