我有一个接口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更容易选择......
答案 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