Differenza tra il casting in String e String.valueOf


88

Qual è la differenza tra

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

e

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

17
Uh, non sono la stessa cosa ... per niente.
Perception

Risposte:


148

Il cast su una stringa funziona solo quando l'oggetto è effettivamente una stringa:

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

Non funzionerà quando l'oggetto è qualcos'altro:

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

String.valueOf()tuttavia proverà a convertire tutto ciò che gli passi in un file String. Gestisce sia primitive ( 42) che oggetti ( new Integer(42), usando quell'oggetto 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"

Nota soprattutto l'ultimo esempio: il passaggio nulla String.valueOf()restituirà la stringa "null".


13
@AdamStelmaszczyk: Dubito che ci sia qualcosa di rilevante. Forse il casting è leggermente più veloce, ma le altre differenze (gestione di null, capacità di gestire altri tipi) sono solo significativamente più importanti di qualsiasi differenza di prestazioni minore che potrebbe esserci.
Joachim Sauer

3
Per spingere ulteriormente questa domanda, c'è qualche differenza significativa tra chiamare String.valueOf()e obj.toString()? (Il primo che mi viene in mente è che obj.toString(), attraverso un'eccezione, se objè nullo.)
Kevin,

3
@ Kevin: per i tipi di riferimento (aka "oggetti") l'unica differenza è ciò che accade con null. Se guardi l'implementazione di String.valueOf()nel tuo JDK vedrai che tutto ciò che fa per i riferimenti non nulli è chiamare toString().
Joachim Sauer

@JoachimSauer Ho sempre pensato che String.valueOf()fosse più elegante di un cast. Ma se String.valueOf()fa tutto ciò che fa il casting, e altro, ci sono ragioni per cui si dovrebbe scegliere di usare un cast? Perché non è stato deprecato?
Shahid M Zubair

1
@ argento: In effetti, ho semplificato troppo. String.valueOf((Object) null)restituirà la stringa "null". Chiamarlo con un valore letterale nullchiamerà String # valueOf (char []) che in realtà genera un NPE quando si passa null.
Joachim Sauer

19

String.valueOf(foo)invoca il metodo di foo.toString() e assegna il risultato alla barra . È null e type safe operation.

Il cast assegnerà solo foo alla barra , se i tipi corrispondono. Altrimenti, l'espressione genererà un file ClassCastException.


5
+1 Per aver spiegato che String.valueOf(Object)invocaObject.toString()
Ryan Amos,

4

Entrambi generano lo stesso output in caso di String.

Casting fallisce nel caso in cui l'oggetto fornito non sia un string.


2

Casting significa che l'oggetto deve essere di tipo String, mentre String.valueOf()può prendere anche altri tipi.


2

Il metodo String.valueOf viene utilizzato per ottenere la rappresentazione String del suo oggetto parametro.

(String) value esegue il cast del valore dell'oggetto su string.

È possibile utilizzare il metodo String.valueOf per ottenere la rappresentazione String di un oggetto senza preoccuparsi dei riferimenti null. Se provi a eseguire il cast di String su un riferimento null, otterrai una 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");

Uscita :strCastOfObj is null


0

Il primo cioè, String.valueOfrestituisce una stringa solo se l'oggetto è un tipo rappresentabile che è un tipo valore o una stringa .. Altrimenti genera l'eccezione.

In quest'ultimo, stai eseguendo direttamente il casting che può fallire se l'oggetto non è una stringa.

Esempio in linea.

http://ideone.com/p7AGh5


Che tipo di eccezione?
Yousha Aleayoub

0

in String.valueOf (); string as work typecasting tutti gli argomenti passati nel metodo valueof () convert in String e proprio come integer.string () converti solo integer in string

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.