java中的字符串连接

Posted

技术标签:

【中文标题】java中的字符串连接【英文标题】:String concat in java 【发布时间】: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();

【问题讨论】:

why concat() is not working here? , java 的可能重复项 尝试将 split() 中的正则表达式从 [ ]+ 更改为 \\s+,以遵循 Javadocs 预定义的 patterns。 【参考方案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);

【讨论】:

以上是关于java中的字符串连接的主要内容,如果未能解决你的问题,请参考以下文章

Java 中 toString() 中的 StringBuilder 与字符串连接

Java - 将引号附加到数组中的字符串并连接数组中的字符串

性能(JAVA)~ 循环中的字符串连接,带有前置和附加

C ++和Java中的字符串连接复杂性[重复]

Java中的基本运算符

连接字符串中的 Spring Profiles