2010-08-31 13 views
6

Desidero sostituire il testo "REPLACEME" con i simboli StringBuffer. Quando stampo simboli, è una stringa valida. Quando stampo la mia query, ha ancora il testo REPLACEME al posto dei simboli. Perché?replaceAll non sostituisce la stringa

private String buildQuery(){ 
    String query = "http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20yahoo.finance.quotes%20where%20symbol%20in%20(REPLACEME)&format=json&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys&callback="; 

    deserializeQuotes(); 

    StringBuffer symbols = new StringBuffer(); 
    for(int i = 0; i < quotes.size();i++){ 
     if(i == (quotes.size()-1)) 
      symbols.append("%22" + quotes.get(i).getSymbol() + "%22%"); //end with a quote 
     else 
      symbols.append("%22" + quotes.get(i).getSymbol() + "%22%2C"); 
    } 

    System.out.println("***SYMBOLS***" + symbols.toString()); 
    query.replaceAll("REPLACEME", symbols.toString()); 

    return query; 
} 

risposta

16

Change

query.replaceAll("REPLACEME", symbols.toString()); 

a:

query = query.replaceAll("REPLACEME", symbols.toString()); 

stringhe in Java sono progettati per essere immutable.
Questo è il motivo per cui replaceAll() non può sostituire i caratteri nel stringa corrente, quindi deve restituire una nuova stringa con i personaggi sostituiti.


Inoltre, se si desidera sostituire semplicemente letterali e non hanno bisogno di sintassi regex uso sostegno replace invece di replaceAll (supporto sintassi regex è unica differenza tra questi due metodi). È più sicuro nel caso in cui si desideri sostituire i letterali che possono contenere metacaratteri regex come *, +, [, ]and others.

+7

Si noti inoltre, le stringhe sono immutabili in Java. Non puoi MAI cambiare una stringa sul posto. –

6

Leggere la documentazione :) replaceAll() restituisce una nuova stringa, sostituisce la stringa esistente. Il motivo è che le stringhe sono oggetti immutabili.

5

L'oggetto String in Java è immutabile. Il replaceAll non sostituirà i dati nella stringa, genererà una nuova stringa. Prova questo:

query = query.replaceAll("REPLACEME", symbols.toString()); 
+0

+1 per aver menzionato l'immutabilità di String. – DJClayworth

Problemi correlati