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".
@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.
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.
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");
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.
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
Odpowiedzi:
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 plikString
. Obsługuje zarówno prymitywy (42
), jak i obiekty (new Integer(42)
, używając tego obiektutoString()
):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
null
doString.valueOf()
zwróci ciąg"null"
.źródło
String.valueOf()
aobj.toString()
? (Pierwszym, który przychodzi mi do głowy, jest to, żeobj.toString()
przejdzie przez wyjątek, jeśliobj
jest zerowy.)null
. Jeśli spojrzysz na implementacjęString.valueOf()
w swoim JDK, zobaczysz, że wszystko, co robi w przypadku odwołań niezerowych, to wywołanietoString()
.String.valueOf()
jest bardziej elegancki niż obsada. Ale jeśliString.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?String.valueOf((Object) null)
zwróci String „null”. Wywołanie go literałemnull
wywoła String # valueOf (char []), który w rzeczywistości generuje NPE, gdy przekazujesznull
.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
.źródło
String.valueOf(Object)
wywołujeObject.toString()
Oba generują ten sam wynik w przypadku
String
.Casting
kończy się niepowodzeniem w przypadku, gdy podany obiekt nie jest plikiemstring.
źródło
Rzutowanie oznacza, że obiekt musi być typu String, ale
String.valueOf()
może mieć również inne typy.źródło
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.
źródło
Wyjście :
strCastOfObj is null
źródło
Pierwsza z nich, tj.
String.valueOf
Zwraca ł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
źródło
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
źródło