Unterschied zwischen Casting in String und String.valueOf

87

Was ist der Unterschied zwischen

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

und

Object foo = "something";
String bar = (String) foo;
Aussteigen
quelle
17
Äh, sie sind nicht gleich ... überhaupt nicht.
Wahrnehmung

Antworten:

147

Das Umwandeln in einen String funktioniert nur, wenn das Objekt tatsächlich ein String ist:

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

Es wird nicht funktionieren, wenn das Objekt etwas anderes ist:

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

String.valueOf()Es wird jedoch versucht, alles, was Sie übergeben, in a umzuwandeln String. Es behandelt sowohl Grundelemente ( 42) als auch Objekte ( new Integer(42)unter Verwendung dieses Objekts 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"

Beachten Sie insbesondere das letzte Beispiel: Wenn Sie nullan übergeben , String.valueOf()wird die Zeichenfolge zurückgegeben "null".

Joachim Sauer
quelle
13
@AdamStelmaszczyk: Ich bezweifle, dass es irgendetwas gibt, das relevant ist. Vielleicht ist das Casting etwas schneller, aber die anderen Unterschiede (Null-Handling, Fähigkeit, mit anderen Typen umzugehen) sind nur wesentlich wichtiger als etwaige geringfügige Leistungsunterschiede.
Joachim Sauer
3
Gibt es einen signifikanten Unterschied zwischen Anrufen String.valueOf()und obj.toString()? (Der erste, der mir in den Sinn kommt, ist, dass obj.toString()durch eine Ausnahme, wenn objnull ist.)
Kevin
3
@ Kevin: Bei Referenztypen (auch "Objekte" genannt) ist der einzige Unterschied, was passiert null. Wenn Sie sich die Implementierung String.valueOf()in Ihrem JDK ansehen, werden Sie feststellen, dass für Nicht-Null-Referenzen nur ein Aufruf erforderlich ist toString().
Joachim Sauer
@ JoachimSauer Ich fand String.valueOf()es immer eleganter als eine Besetzung. Aber wenn String.valueOf()alles, was das Casting tut, und noch mehr, gibt es Gründe, warum man sich für ein Casting entscheiden würde? Warum wurde es nicht veraltet?
Shahid M Zubair
1
@silver: In der Tat habe ich zu stark vereinfacht. String.valueOf((Object) null)gibt den String "null" zurück. nullWenn Sie es mit einem Literal aufrufen, wird String # valueOf (char []) aufgerufen, der beim Übergeben tatsächlich eine NPE auslöst null.
Joachim Sauer
19

String.valueOf(foo)Invokes foo ‚s .toString()Verfahren und weist das Ergebnis auf die die bar . Es ist null und typsicher.

Beim Casting wird der Leiste nur foo zugewiesen , wenn die Typen übereinstimmen. Andernfalls wird der Ausdruck a auslösen .ClassCastException

Darijan
quelle
5
+1 Für die Erklärung, die String.valueOf(Object)ruftObject.toString()
Ryan Amos
4

Beide erzeugen im Fall von die gleiche AusgabeString .

Casting schlägt fehl, wenn das angegebene Objekt nicht a ist string.

Suresh Atta
quelle
2

Casting bedeutet, dass das Objekt vom Typ String sein muss, während String.valueOf()es auch andere Typen annehmen kann.

Stürme
quelle
2

Die String.valueOf-Methode wird verwendet, um die String-Darstellung des Parameterobjekts abzurufen.

Der Wert (String) wandelt den Objektwert in einen String um.

Sie können die String.valueOf-Methode verwenden, um die String-Darstellung eines Objekts abzurufen, ohne sich um Nullreferenzen kümmern zu müssen. Wenn Sie versuchen, String in eine Nullreferenz umzuwandeln, erhalten Sie eine NullPointerException.

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

Ausgabe :strCastOfObj is null

Zaki
quelle
0

Die erste, dh, String.valueOfgibt nur dann eine Zeichenfolge zurück, wenn das Objekt ein darstellbarer Typ ist, der ein Werttyp oder eine Zeichenfolge ist. Andernfalls wird die Ausnahme ausgelöst.

In letzterem Fall werden Sie direkt umgewandelt, was fehlschlagen kann, wenn das Objekt keine Zeichenfolge ist.

Online-Beispiel.

http://ideone.com/p7AGh5

Sri Harsha Chilakapati
quelle
Welche Art von Ausnahme?
Yousha Aleayoub
0

in String.valueOf (); string as work typecasting alle Argumente, die in der Methode valueof () übergeben wurden, konvertieren in String und konvertieren genau wie integer.string () Integer nur in String

anuragsingh
quelle