我检查了许多有关在Java中连接许多字符串的最佳方法的争论。
据我了解,Stringbuilder比+运算符更有效。
不幸的是,我的问题有点不同。
给定字符串:"AAAAA",我们如何将其与n倍于char '_'的字符串连接,知道'_'必须在字符串" AAAAA"之前
如果n等于3和str="AAAAA",则结果必须为字符串" ___AAAAA"
String str ="AAAAA";
for (int i=0;i<100;i++){
str="_"+str;
}
在我的程序中,我有一个Longs String,所以我必须使用有效的方法。
谢谢
编辑1:
当我阅读一些解决方案时,我发现我只要求一个案例,所以我来到了这个我认为很好的解决方案:
public class Concatenation {
public static void main(String[] args) {
//so str is the String that i want to modify
StringBuilder str = new StringBuilder("AAAAA");
//As suggested
StringBuilder space = new StringBuilder();
for (int i = 0; i < 3; i++) {
space.append("_");
}
//another for loop to concatenate different char and not only the '_'
for (int i = 0; i < 3; i++) {
char next = getTheNewchar();
space.append(next);
}
space.append(str);
str = space;
System.out.println(str);
}
public static char getTheNewchar(){
//normally i return a rondom char, but for the case of simplicity i return the same char
return 'A';
}
}
为什么不能在单独的步骤中构建"___",然后再执行"___" +"AAAA"?
@ cricket_007对于这种情况是个好主意,但是在我的程序中,我不得不处理一般情况。您的解决方案仅对那些" _"情况有效。
不明白你的意思。但是,如果始终以str ="AAAAA"开头,则str ="_" + str绝对无效。您可以在一行中构建"___"。 stackoverflow.com/a/16812721/2308683然后,您只需使thatString + str
@ cricket_007我理解您的解决方案,但是我的程序比我上面提到的程序复杂。有时我每次用一个字符时,im程序都比较复杂,所以我每次都必须附加String。
如果您的程序更复杂,那么为什么要提供这个简单的示例?我只是说下划线可以预先填写。您无需将str重复复制到串联中
@ cricket_007首先,我感谢您的帮助。对于StackOverflow提出的问题,我尝试提出一个简单的示例,使其易于阅读,看起来像我的问题。
别担心。您不需要str = new StringBuilder("AAAAA"),顺便说一句,您只需在最后加上space.append("AAAAA");
串联Java中字符串的最佳方法:不用...。字符串在Java中是不可变的。 每次连接时,都会生成一个新的对象。 请使用StringBuilder。
StringBuilder sb = new StringBuilder();
for (int i=0;i<100;i++){
sb.append("_");
}
sb.append("AAAAA");
String str = sb.toString();
谢谢你我最初误解了这个问题。现在修复。
我不确定为什么要来回走,但是并不需要" _AAAA_AAAA_AAAA"。
如果您不知道最终字符串的大小,则StringBuilder是最好的方法,因为它可以根据需要分配内存。如果您知道最终字符串的大小,则无需创建复杂的对象即可进行简单的char数组填充。
@Sxilderik [检查此] [1]。它显示StringBuilder在连接字符串[1]时要快得多:java67.com/2015/05/4-ways-to-concatenate-strings-in-java.html嗯,我想我不知道如何正确设置链接在评论中
@ CraigR8806是的,但是它仍然比填充char数组慢
@ CraigR8806您的解决方案更现实,并且与cricket_007之前显示的想法相同,我将编辑问题以显示我错过的部分,谢谢。
如果设置为使用StringBuilder对象执行简单的char数组处理可以执行的操作,则至少可以使用sb.append(_)而不是sb.append("_")来获得一些循环。使用字符串保存单个字符始终会降低性能。
@zakzak让我感到困惑,为什么当您特别要求它时,却没有选择最快的方法来串联字符串(在Java中(时间效率)来串联字符串的最佳方法),但是好的,没问题:)
@Sxilderik你好,谢谢你的帮助,我给你投票。原因是我喜欢简单而不是复杂的解决方案。
转到char数组,分配合适的大小,填充数组,然后加总为字符串。
不能打败它。
public String concat(char c, int l, String string) {
int sl = string.length();
char[] buf = new char[sl + l];
int pos = 0;
for (int i = 0; i < l; i++) {
buf[pos++] = c;
}
for (int i = 0; i < sl; i++) {
buf[pos++] = string.charAt(i);
}
return String.valueOf(buf);
}
这比使用StringBuilder快得多
我会做类似的事情:
import java.util.Arrays;
...
int numUnderbars = 3;
char[] underbarArray = new char[numUnderbars];
Arrays.fill(underbarArray, '_');
String output = String.valueOf(underbarArray) +"AAAA";
但实际情况是,所提供的任何解决方案在运行时间上都可能会有所不同。
很好地使用Arrays.fill,感谢您的指导。另一方面,a.concat(b)比a + b快(不涉及StringBuilder)(但不要执行a.concat(b).concat(c)!)。
如果您不喜欢写循环使用
org.apache.commons.lang.StringUtils class repeat(str,n) method.
您的代码会更短:
String str=new StringBuilder(StringUtils.repeat("_",n)).append("AAAAA").toString();
顺便说一句:
问题的实际答案在该repeat方法的代码中。
当需要重复1或2个字符时,它将在循环中使用char数组,否则将使用StringBuilder附加解决方案。
不知道是否需要整个库的开销。 new StringBuilder(new String(new char[n]).replace("\0","_")).append("AAAAA").toString()
这与偏好有关。 StringUtils有很多有用的方法。并且您确定在替换方法中使用RegEx会比循环中简单的StringBuilder append更快吗?
不是很确定,但是它实际上不需要库就可以完成相同的操作。
通常,它取决于应用程序的性质-如果它是独立的简单应用程序,那么是的,最好不要使用库。如果它是服务器端应用程序,那么谁又在乎一个罐子(通常以前在这里)?
顺便说一句:@ CraigR8806的StringBuilder解决方案既简单又最好。