Різниця між кастингом у String та String.valueOf


88

Яка різниця між

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

і

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

17
Е-е, вони не однакові ... взагалі.
Сприйняття

Відповіді:


148

Прив’язка до рядка працює лише тоді, коли об’єктом насправді є рядок:

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

Це не буде працювати, коли об’єктом є щось інше:

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

String.valueOf()однак намагатиметься перетворити все, що ви передасте, в String. Він обробляє як примітиви ( 42), так і об'єкти ( new Integer(42), використовуючи об'єкти 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"

Особливо зверніть увагу на останній приклад: перехід nullдо String.valueOf()поверне рядок "null".


13
@AdamStelmaszczyk: Я сумніваюся, що є щось із цього. Можливо, кастинг відбувається трохи швидше, але інші відмінності (нульова обробка, здатність обробляти інші типи) просто значно важливіші, ніж будь-яка незначна різниця в продуктивності, яка може бути.
Йоахім Зауер,

3
Щоб просунути це питання трохи далі, чи є якась суттєва різниця між дзвінком String.valueOf()та obj.toString()? (Перше, що мені спадає на думку, це те obj.toString(), що через виняток objмає значення null.)
Кевін,

3
@Kevin: для посилальних типів (вони ж "об'єкти") єдина різниця полягає в тому, що відбувається null. Якщо ви подивитесь на реалізацію String.valueOf()у вашому JDK, то побачите, що все, що він робить для ненульових посилань - це виклик toString().
Йоахім Зауер,

@JoachimSauer Я завжди думав, що String.valueOf()це елегантніше, ніж акторський склад . Але якщо String.valueOf()все, що робить кастинг, і багато іншого, чи є якісь причини, чому хтось вирішить використовувати акторський склад? Чому це не застаріло?
Shahid M Zubair

1
@silver: Справді, я спростив. String.valueOf((Object) null)поверне рядок "null". Виклик його з nullлітералом викликає String # valueOf (char []), який фактично видає NPE при вході null.
Йоахім Зауер,

19

String.valueOf(foo)Запускаю Foo «s .toString()методу і привласнює результат до бару . Це безпечний для експлуатації тип.

Кастинг буде просто надайте Foo в бар , якщо типи відповідності. В іншому випадку вираз викине a ClassCastException.


5
+1 За пояснення, що String.valueOf(Object)викликаєObject.toString()
Райан Амос

4

Обидва генерують однакові результати у випадку String.

Casting не вдається у випадку, якщо наданий об'єкт не є string.


2

Кастинг означає, що об'єкт повинен мати тип String, тоді як String.valueOf()може приймати й інші типи.


2

Метод String.valueOf використовується, щоб отримати подання String об'єкта параметра.

(Рядок) значення передає значення об’єкта в рядок.

Ви можете використовувати метод String.valueOf, щоб отримати представлення об’єкта String, не турбуючись про нульові посилання. Якщо ви спробуєте привести String до нульового посилання, ви отримаєте 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");

Вихід :strCastOfObj is null


0

Перший, тобто String.valueOfповертає рядок, лише якщо об'єкт є типом, що представляється, який є типом значення або рядком. В іншому випадку він видає виняток.

В останньому ви здійснюєте прямий привід, який може зазнати невдачі, якщо об’єкт не є рядком.

Інтернет-приклад.

http://ideone.com/p7AGh5


Який тип винятку?
Yousha Aleayoub

0

у String.valueOf (); рядок як тип роботи, який передає весь аргумент, переданий у методі valueof (), перетворює в String, як і integer.string (), перетворює ціле число лише у рядок

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.