Perbedaan antara mentransmisikan ke String dan String.valueOf

89

Apa perbedaan antara

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

dan

Object foo = "something";
String bar = (String) foo;
Keluar
sumber
17
Uh, mereka tidak sama ... sama sekali.
Persepsi

Jawaban:

150

Mentransmisikan ke string hanya berfungsi jika objek sebenarnya adalah string:

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

Ini tidak akan berfungsi jika objeknya adalah sesuatu yang lain:

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

String.valueOf()namun akan mencoba mengubah apa pun yang Anda berikan menjadi file String. Ini menangani primitif ( 42) dan objek ( new Integer(42), menggunakan objek itu 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"

Perhatikan terutama contoh terakhir: meneruskan nullke String.valueOf()akan mengembalikan string "null".

Joachim Sauer
sumber
14
@AdamStelmaszczyk: Saya ragu ada yang relevan. Mungkin casting sedikit lebih cepat, tetapi perbedaan lainnya (penanganan null, kemampuan untuk menangani jenis lain) jauh lebih penting daripada perbedaan performa kecil yang mungkin ada.
Joachim Sauer
4
Untuk mendorong pertanyaan ini lebih jauh, apakah ada perbedaan yang signifikan antara menelepon String.valueOf()dan obj.toString()? (Yang pertama terlintas di benak saya adalah bahwa obj.toString()melalui pengecualian jika objnol.)
Kevin
3
@Kevin: untuk jenis referensi (alias "objek") satu-satunya perbedaan adalah apa yang terjadi dengan null. Jika Anda melihat implementasi String.valueOf()di JDK Anda, Anda akan melihat bahwa semua yang dilakukannya untuk referensi non-null adalah memanggil toString().
Joachim Sauer
1
Mencoba str = String.valueOf(null)di Java 7 Update 80, itu melempar NullPointerException.
perak
1
@ Silver: Memang, saya terlalu menyederhanakan. String.valueOf((Object) null)akan mengembalikan String "null". Memanggilnya dengan literal nullakan memanggil String # valueOf (char []) yang sebenarnya melempar NPE saat Anda masuk null.
Joachim Sauer
19

String.valueOf(foo)memanggil foo 's .toString()metode dan ditunjuk hasilnya ke dalam bar . Ini adalah operasi yang aman dan bertipe null.

Transmisi hanya akan menetapkan foo ke bilah , jika jenisnya cocok. Jika tidak, ekspresi tersebut akan menampilkan ClassCastException.

darijan
sumber
5
+1 Untuk menjelaskan bahwa String.valueOf(Object)memanggilObject.toString()
Ryan Amos
4

Keduanya menghasilkan keluaran yang sama dalam kasus String.

Casting gagal dalam kasus objek yang diberikan Bukan a string.

Suresh Atta
sumber
3

Pengecoran berarti bahwa objek harus berjenis String, sementara String.valueOf()dapat mengambil jenis lainnya juga.

badai
sumber
2

Metode String.valueOf digunakan untuk mendapatkan representasi String dari objek parameternya.

(String) nilai mentransmisikan nilai objek ke string.

Anda dapat menggunakan metode String.valueOf untuk mendapatkan representasi String dari suatu objek tanpa mengkhawatirkan referensi null. Jika Anda mencoba mentransmisikan String pada referensi null, Anda akan mendapatkan NullPointerException.

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

Keluaran :strCastOfObj is null

Zaki
sumber
0

Yang pertama yaitu, String.valueOfmengembalikan string hanya jika objek adalah tipe yang dapat direpresentasikan yang merupakan tipe nilai atau String .. Jika tidak, itu akan melontarkan pengecualian.

Yang terakhir, Anda langsung melakukan casting yang bisa gagal jika objeknya bukan string.

Contoh online.

http://ideone.com/p7AGh5

Sri Harsha Chilakapati
sumber
Jenis pengecualian apa?
Yousha Aleayoub
0

di String.valueOf (); string sebagai pekerjaan typecasting semua argumen yang diteruskan dalam metode valueof () dikonversi dalam String dan seperti integer.string (), ubah integer menjadi string saja

anuragsingh
sumber