Разница между приведением к String и String.valueOf


88

В чем разница между

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

а также

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

17
Ух, они не такие ... совсем.
Perception

Ответы:


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)вернет String "null". Вызов его с помощью литерала nullвызовет String # valueOf (char []), который фактически выбрасывает NPE, когда вы переходите null.
Иоахим Зауэр

19

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

Кастинг будет просто присвойте Foo в бар , если типы соответствия. В противном случае выражение выдаст ClassCastException.


5
+1 Для объяснения этого String.valueOf(Object)призываObject.toString()
Райан Амос

4

Оба генерируют одинаковый вывод в случае String.

Casting не работает, если предоставленный объект не является string.


2

Приведение означает, что объект должен иметь тип String, но String.valueOf()может принимать и другие типы.


2

Метод String.valueOf используется для получения строкового представления объекта параметра.

(String) value преобразует значение объекта в строку.

Вы можете использовать метод String.valueOf для получения строкового представления объекта, не беспокоясь о нулевых ссылках. Если вы попытаетесь применить 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возвращает строку, только если объект является представимым типом, который является типом значения или String .. В противном случае он вызывает исключение.

В последнем случае вы выполняете прямое приведение типов, что может привести к сбою, если объект не является строкой.

Онлайн-пример.

http://ideone.com/p7AGh5


Какого типа исключение?
Юша Алеайуб

0

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.