Różnica między rzutowaniem na String i String.valueOf

88

Jaka jest różnica pomiędzy

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

i

Object foo = "something";
String bar = (String) foo;
Spadkowicz
źródło
17
Uh, nie są takie same ... wcale.
Percepcja

Odpowiedzi:

148

Rzutowanie na łańcuch działa tylko wtedy, gdy obiekt jest łańcuchem:

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

Nie zadziała, gdy obiekt jest czymś innym:

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

String.valueOf()jednak spróbuje przekształcić wszystko, co do niego przekażesz, na plik String. Obsługuje zarówno prymitywy ( 42), jak i obiekty ( new Integer(42), używając tego obiektu 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"

Zwróć uwagę szczególnie na ostatni przykład: przekazanie nulldo String.valueOf()zwróci ciąg "null".

Joachim Sauer
źródło
13
@AdamStelmaszczyk: Wątpię, czy jest coś odpowiedniego. Może rzucanie jest nieco szybsze, ale inne różnice (obsługa zerowa, zdolność do obsługi innych typów) są po prostu znacznie ważniejsze niż jakiekolwiek drobne różnice w wydajności, które mogą występować.
Joachim Sauer
3
Mówiąc dalej, czy jest jakaś znacząca różnica między dzwonieniem String.valueOf()a obj.toString()? (Pierwszym, który przychodzi mi do głowy, jest to, że obj.toString()przejdzie przez wyjątek, jeśli objjest zerowy.)
Kevin
3
@Kevin: w przypadku typów referencyjnych (zwanych też „obiektami”) jedyną różnicą jest to, co się dzieje z null. Jeśli spojrzysz na implementację String.valueOf()w swoim JDK, zobaczysz, że wszystko, co robi w przypadku odwołań niezerowych, to wywołanie toString().
Joachim Sauer
@JoachimSauer Zawsze uważałem, że String.valueOf()jest bardziej elegancki niż obsada. Ale jeśli String.valueOf()wszystko, co robi casting, a nawet więcej, czy są jakieś powody, dla których ktoś zdecydowałby się użyć obsady? Dlaczego nie został wycofany?
Shahid M Zubair
1
@silver: Rzeczywiście, uprościłem. String.valueOf((Object) null)zwróci String „null”. Wywołanie go literałem nullwywoła String # valueOf (char []), który w rzeczywistości generuje NPE, gdy przekazujesz null.
Joachim Sauer
19

String.valueOf(foo)Wywołuje foo „s .toString()metody i przypisuje wynik do The bar . Jest to operacja zerowa i bezpieczna dla typu.

Rzutowanie po prostu przypisze foo do paska , jeśli typy są zgodne. W przeciwnym razie wyrażenie zwróci ClassCastException.

darijan
źródło
5
+1 Za wyjaśnienie, że String.valueOf(Object)wywołujeObject.toString()
Ryan Amos
4

Oba generują ten sam wynik w przypadku String.

Casting kończy się niepowodzeniem w przypadku, gdy podany obiekt nie jest plikiem string.

Suresh Atta
źródło
2

Rzutowanie oznacza, że ​​obiekt musi być typu String, ale String.valueOf()może mieć również inne typy.

burze
źródło
2

Metoda String.valueOf służy do pobrania reprezentacji String obiektu parametru.

(String) wartość rzutuje wartość obiektu na łańcuch.

Możesz użyć metody String.valueOf, aby uzyskać reprezentację String obiektu bez martwienia się o zerowe odwołania. Jeśli spróbujesz rzucić String na odwołanie o wartości null, otrzymasz NullPointerException.

Syamantak Basu
źródło
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");

Wyjście :strCastOfObj is null

Zaki
źródło
0

Pierwsza z nich, tj. String.valueOfZwraca łańcuch tylko wtedy, gdy obiekt jest typem reprezentowalnym, który jest typem wartości lub typu String .. W przeciwnym razie zgłasza wyjątek.

W drugim przypadku rzutowanie bezpośrednie może się nie powieść, jeśli obiekt nie jest łańcuchem.

Przykład online.

http://ideone.com/p7AGh5

Sri Harsha Chilakapati
źródło
Jaki rodzaj wyjątku?
Yousha Aleayoub
0

w String.valueOf (); string jako typ pracy - rzutowanie wszystkich argumentów przekazanych w metodzie valueof () konwertuj na String i tak jak integer.string () konwertuje liczbę całkowitą tylko na łańcuch

anuragsingh
źródło