有效连接多个字符串

时间:2015-05-07 14:39:04

标签: java performance

我有一个接口IO,提供两种方法,void in(String in)和String out()。我已经在第一个天真的版本中实现了它:

private String tmp="";
public void in(String in){
  tmp=tmp+in;
}
public String out(){
  return tmp;
}

我知道这是一个可怕的实现,如果你有多个很长的字符串。你需要创建一个长度为= tmp.length + in.length的新String,复制tmp,复制。然后再重复一遍evey插入的String。但是什么是更好的实现呢?

private List<String> tmp= new ArrayList<>() //maybe use an different list?
public void in(String in){
  tmp.add(in);
}
public String out(){
  return connect(tmp);
}
private String connect(List<String> l){
  if(l.size()==1) return l.get(0);
  List<String> half = new ArrayList<>();
  for(int i=0;i<l.size();i+=2){
    half.add(l.get(i)+l.get(i+1)); \\I have to check, if i+1 is valid, but this is just a draft ;)
  }
  return connect(half);
}

这有点好,它必须使相同数量的字符串连接,但字符串将由averange小。但它有一个巨大的偏移,我不确定它是否值得。应该比这个imho更容易选择......

3 个答案:

答案 0 :(得分:0)

您可能正在寻找StringBuilder

private StringBuilder tmp = new StringBuilder();

public void in(String in) {
    tmp.append(in);
}

public String out() {
    return tmp.toString();
}

答案 1 :(得分:0)

标准库提供了一个专门用于高效字符串连接的类,StringBuilder

https://docs.oracle.com/javase/7/docs/api/java/lang/StringBuilder.html

请注意,编译器实际上会将字符串“addition”添加到涉及StringBuilders的表达式中,并且在很多简单/天真的情况下,它还会优化代码以使用append()方法而不是不断创建新的StringBuilders。但是,在您的情况下,显式使用StringBuilder绝对是一个好主意。

至于你对优化连接的冒险尝试,老实说,我认为你不会注意到天真解决方案的任何改进,干净的代码总是比“稍快的代码”更好,除非时钟周期非常昂贵。 / p>

答案 2 :(得分:0)

来自Java Doc:

  

如果您的文字可以更改,并且只能从一个文本访问   线程,使用StringBuilder,因为StringBuilder是不同步的。

     

如果您的文字可以更改,并且将从多个主题访问,   使用StringBuffer,因为StringBuffer是同步的。

在您的情况下StringBuilder可以正常使用。

  

StringBuilder类通常应优先使用   一,因为它支持所有相同的操作,但它更快,因为它   不执行同步。   http://download.oracle.com/javase/6/docs/api/java/lang/StringBuffer.html