7

「REPLACEME」というテキストをStringBufferシンボルに置き換えたいのですが。記号を印刷するとき、それは有効な文字列です。クエリを印刷すると、記号ではなくREPLACEMEというテキストが表示されます。なんで?

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;
}
4

3 に答える 3

19

変化する

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

に:

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

Javaの文字列は、不変になるように設計されています。
そのため、現在の文字列の文字を置き換えることはできません。そのため、文字が置き換えられた新しい文字列を返す必要replaceAll()あります


また、リテラルを単純に置き換えたい場合で、replace代わりに正規表現構文サポートを使用する必要がない場合replaceAll(正規表現構文サポートは、これら2つの方法の違いにすぎません)。、、、など*の正規表現メタ文字を含むことができるリテラルを置き換えたい場合は、より安全です。+[]

于 2010-08-31T17:38:28.633 に答える
6

ドキュメントを読んでください:)replaceAll()は新しい文字列を返しますが、既存の文字列内で置き換えられます。その理由は、文字列が不変のオブジェクトであるためです。

于 2010-08-31T17:38:52.777 に答える
5

JavaのStringオブジェクトは不変です。replaceAllは文字列内のデータを置き換えず、新しい文字列を生成します。これを試して:

query = query.replaceAll("REPLACEME", symbols.toString());
于 2010-08-31T17:38:57.267 に答える