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 modifynewStr时,它会返回一个String作为连接结果的 new 。你没有对结果做任何事情。

您需要执行以下操作:newStr = newStr.concat(tokens[i]);

String是java中的不可变类型,所以它的方法是这样工作的,返回一个新String对象。考虑使用 (mutable)StringBuilder代替。StringBuilder维护一个可以增长的内部缓冲区,因此避免了String使用 concatenation 和 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。现在,想想它的含义......我不喜欢过早优化,但我相信实现这一点的合乎逻辑的方法是使用 aStringBuilder如下......

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 回答