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.