Diferença entre o cast para String e String.valueOf


89

Qual é a diferença entre

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

e

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

17
Uh, eles não são os mesmos ... em tudo.
Percepção de

Respostas:


150

A conversão para string só funciona quando o objeto é realmente uma string:

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

Não funcionará quando o objeto for outra coisa:

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

String.valueOf()no entanto, tentará converter tudo o que você passar para um String. Ele lida com primitivos ( 42) e objetos ( new Integer(42), usando aquele objeto 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"

Observe especialmente o último exemplo: passar nullpara String.valueOf()retornará a string "null".


14
@AdamStelmaszczyk: Duvido que haja algo relevante. Talvez a conversão seja um pouco mais rápida, mas as outras diferenças (manipulação de nulos, capacidade de manipular outros tipos) são apenas significativamente mais importantes do que qualquer pequena diferença de desempenho que possa haver.
Joachim Sauer

4
Para levar essa questão um pouco mais longe, há alguma diferença significativa entre pagar String.valueOf()e obj.toString()? (O primeiro que me vem à mente é que obj.toString()passará por uma exceção se objfor nulo.)
Kevin

3
@Kevin: para tipos de referência (também conhecidos como "objetos") a única diferença é o que acontece com null. Se você observar a implementação de String.valueOf()em seu JDK, verá que tudo o que ele faz para referências não nulas é chamar toString().
Joachim Sauer

1
Testado str = String.valueOf(null)no Java 7 Update 80, ele lança um NullPointerException.
prata

1
@silver: De fato, simplifiquei demais. String.valueOf((Object) null)retornará a String "null". Chamá-lo com um literal nullirá chamar String # valueOf (char []) que realmente lança um NPE quando você passa null.
Joachim Sauer

19

String.valueOf(foo)invoca o método foo.toString() e atribui o resultado à barra . É uma operação nula e segura.

Casting irá apenas atribuir foo à barra , se os tipos forem correspondentes. Caso contrário, a expressão lançará um ClassCastException.


5
1 Para explicar que String.valueOf(Object)invocaObject.toString()
Ryan Amos

4

Ambos geram a mesma saída no caso de String.

Casting falha no caso de o objeto fornecido não ser um string.


3

Casting significa que o objeto precisa ser do tipo String, embora String.valueOf()possa assumir outros tipos também.


2

O método String.valueOf é usado para obter a representação String de seu objeto de parâmetro.

(String) valor converte o valor do objeto em string.

Você pode usar o método String.valueOf para obter a representação String de um objeto sem se preocupar com referências nulas. Se você tentar lançar String em uma referência nula, obterá uma 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");

Produto :strCastOfObj is null


0

O primeiro, isto é, String.valueOfretorna uma string somente se o objeto for um tipo representável que é um tipo de valor ou uma String. Caso contrário, ele lança a exceção.

No último, você está lançando diretamente, o que pode falhar se o objeto não for uma string.

Exemplo online.

http://ideone.com/p7AGh5


Que tipo de exceção?
Yousha Aleayoub

0

em String.valueOf (); string como trabalho typecasting de todos os argumentos passados ​​no método valueof () converter em String e assim como integer.string () converter inteiro em string apenas

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.