2011-10-13 15 views
40

Sto lavorando nell'ottimizzazione del codice Java. Sono poco chiaro circa la differenza tra String.valueOf o il segno +"":Valore stringaOf vs concatenazione con stringa vuota

int intVar = 1; 
String strVar = intVar + ""; 
String strVar = String.valueOf(intVar); 

Qual è la differenza tra la linea 2 e 3?

+0

Possibile duplicato di [È la conversione a String using ("" + ) cattiva pratica?] (Http://stackoverflow.com/questions/1572708/is-conversion-to-string-using-int-value-bad -practice) – Necreaux

risposta

54
public void foo(){ 
int intVar = 5; 
String strVar = intVar+"";  
} 

Questo approccio utilizza StringBuilder per creare stringa risultante

public void foo(); 
    Code: 
    0: iconst_5 
    1: istore_1 
    2: new  #2; //class java/lang/StringBuilder 
    5: dup 
    6: invokespecial #3; //Method java/lang/StringBuilder."<init>":()V 
    9: iload_1 
    10: invokevirtual #4; //Method java/lang/StringBuilder.append:(I)Ljava/lan 
g/StringBuilder; 
    13: ldc  #5; //String 
    15: invokevirtual #6; //Method java/lang/StringBuilder.append:(Ljava/lang/ 
String;)Ljava/lang/StringBuilder; 
    18: invokevirtual #7; //Method java/lang/StringBuilder.toString:()Ljava/la 
ng/String; 
    21: astore_2 
    22: return 

public void bar(){ 
int intVar = 5; 
String strVar = String.valueOf(intVar); 
} 

Questo approccio invoca semplicemente un metodo statico di String per ottenere la versione stringa di int

public void bar(); 
    Code: 
    0: iconst_5 
    1: istore_1 
    2: iload_1 
    3: invokestatic #8; //Method java/lang/String.valueOf:(I)Ljava/lang/Stri 
ng; 
    6: astore_2 
    7: return 

, che a sua volta chiama Integer.toString()

5

Preferirei valueOf(), perché penso che sia più leggibile ed esplicito.

Qualsiasi preoccupazione relativa alle prestazioni sono micro-ottimizzazioni che non sarebbero misurabili. Non mi preoccuperei di loro finché non potrei fare una misurazione e vedere che hanno fatto la differenza.

3

La prima linea è equivalente a

String strVal = String.valueOf(intVar) + ""; 

modo che ci sia un po 'di più (e inutile) del lavoro da fare. Non sono sicuro se il compilatore ottimizza le concatenazioni con valori letterali stringa vuoti. Se non lo fa (e guardando @ risposta di Jigar a quanto pare non lo fa), questo a sua volta diventare

String strVal = new StringBuilder().append(String.valueOf(intVar)) 
         .append("").toString(); 

Quindi si dovrebbe davvero utilizzare direttamente String.valueOf.

18

Chiediti lo scopo del codice. E 'per:

  • Concatenate una stringa vuota con un valore
  • Convertire un valore in una stringa

Suona molto più simile a questi ultimi di me ... ed è per questo che avevo utilizzare String.valueOf. Ogni volta che riesci a leggere il tuo codice nello stesso modo in cui descrivi ciò che vuoi ottenere, è una buona cosa.

Si noti che questo funziona per tutti i tipi e restituirà "null" quando viene passato un riferimento null anziché il lancio di NullPointerException. Se stai utilizzando una classe (non uno int come in questo esempio) e tu vuoi per generare un'eccezione se è nulla (ad esempio perché rappresenta un bug), chiama invece il numero toString sul riferimento.

+2

'String.valueOf (int x)' * richiama semplicemente un metodo statico di String per ottenere la versione String di int *. Quando parliamo di Android, si consiglia di * evitare * di utilizzare metodi statici. Cosa ne pensi di questo approccio in Android? – Machado

1

La concatenazione di stringhe e altre variabili utilizza effettivamente String.valueOf() (e StringBuilder) al di sotto, quindi il compilatore si spera di scartare la stringa vuota e produrre gli stessi bytecode in entrambi i casi.

+0

guardando la risposta di @ Jigar apparentemente non fa questa ottimizzazione – Thilo

+1

@Thilo: c'è però più di un compilatore Java. –

0

Dal punto di ottimizzazione, preferirò sempre lo String.valueOf() tra i due. Il primo è solo un trucco, cercando di ingannare la conversione dello intVar in un String perché l'operatore +.

-1
String strVar1 = intVar+""; 
String strVar2 = String.valueOf(intVar); 

strVar1 è equvalent a strVar2, ma utilizzando int + emptyString "" non è elegante modo per farlo.

utilizzando valueOf è più efficace.

7

L'utilizzo di String.valueOf(int) o, meglio, Integer.toString(int) è relativamente più efficiente per la macchina. Tuttavia, a meno che le prestazioni non siano critiche (nel qual caso non ti suggerirei di utilizzarle entrambe) Quindi ""+ x è un uso molto più efficiente del tuo tempo. IMHO, questo di solito è più importante. A volte molto più importante.

In altre parole, ""+ spreca un oggetto, ma lo Integer.toString() ne crea comunque. O il tuo tempo è più importante o vuoi evitare di creare oggetti a tutti i costi. È altamente improbabile che si trovi nella posizione in cui la creazione di più oggetti va bene, ma la creazione di un altro non lo è.

+0

Bella frase: "Allora" "+ x è un uso molto più efficiente del tuo tempo. IMHO, questo di solito è più importante." – teddy

Problemi correlati