【问题标题】:String concat in javajava中的字符串连接
【发布时间】:2012-08-28 16:03:03
【问题描述】:

我正在尝试在字符串中连接字符串数组值,下面的代码不起作用

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();
}

【问题讨论】:

标签: java


【解决方案1】:

当您调用newStr.concat(tokens[i]); 时,此不会修改newStr,它返回一个新的String,这是串联的结果。你没有对结果做任何事情。

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

String在java中是一个不可变类型,所以它的方法是这样工作的,返回一个新的String对象。考虑改用(可变)StringBuilderStringBuilder 维护一个可以增长的内部缓冲区,因此避免了使用连接和不可变 Strings 带来的不必要的 String 副本。

【讨论】:

  • 有趣,pb2q...我们在同一时间发布。
【解决方案2】:

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();

【讨论】:

    【解决方案3】:

    我尝试用 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);
    }
    

    【讨论】:

      猜你喜欢
      • 2011-04-02
      • 2013-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多