0

文字列内の文字列配列値を連結しようとしています。以下のコードは機能しません

private void newString() {

    String str = "Split me"; 
    String[] tokens = str.split("[ ]+");

    String newStr = new String();

    for(int i=0; i<tokens.length; i++){
        newStr.concat(tokens[i]);
    }

    System.out.println("NEW STRING IS : " + newStr);
}


public static void main(String[] args){
    Main m = new Main();
    m.newString();
}
4

3 に答える 3

10

newStr.concat(tokens[i]);this doesn't modifyを呼び出すと、連結の結果でnewStrある new が返されます。Stringあなたは結果に対して何もしていません。

次のようなことをする必要があります:newStr = newStr.concat(tokens[i]);

StringStringは Java の不変型であるため、メソッドは次のように機能し、新しいオブジェクトを返します。StringBuilder代わりに(mutable) の使用を検討してください。StringBuilder拡張可能な内部バッファーを維持するため、String連結と immutable の使用に伴う不要なコピーを回避しStringsます。

于 2012-09-04T02:09:54.190 に答える
7

String不変です。当然、String.concat真新しいを返しますString

...このオブジェクトによって表される文字シーケンスと引数文字列によって表されるString文字シーケンスを連結した文字シーケンスを表す、新しいオブジェクトが作成されます。String

あなたがやろうとしている方法では、コードは次のようになります...

String glued = "";

for (final String token : tokens) {
  glued = glued.concat(token);
}

さて、このアプローチの問題点は、データのコピーを大量に作成していることです。Stringそれぞれconcatが のすべてのデータと のデータをコピーしgluedますtoken。さて、その意味について考えてみてください...私は時期尚早の最適化のファンではありませんが、これを達成する論理的な方法は、代わりに次のように使用することだと思いStringBuilderます...

final StringBuffer buf = new StringBuffer();
for (final String token : tokens) {
  buf.append(token);
}
final String glued = buf.toString();
于 2012-09-04T02:09:54.240 に答える
2

StringBuilderで修正しようとしています。新しいコードは次のとおりです。

private void newString() {
    String str = "Split me"; 
    String[] tokens = str.split("[ ]+");
    StringBuilder newStr = new StringBuilder();

    for(int i=0; i<tokens.length; i++){
        newStr.append(tokens[i]);
    }
    System.out.println("NEW STRING IS : " + newStr);
}
于 2012-09-04T02:29:01.070 に答える