基本上给定一个int,我需要生成一个长度相同但只包含指定字符的String。相关问题here,但它与C#有关, 与字符串中的内容有关。
这question,我的回答是我问这个的原因。我不确定什么是表现明智的最佳方式。
方法签名:
String getPattern(int length, char character);
用法:的
//returns "zzzzzz"
getPattern(6, 'z');
String getPattern(int length, char character) {
String result = "";
for (int i = 0; i < length; i++) {
result += character;
}
return result;
}
这是我能表现得最好的吗?
答案 0 :(得分:6)
您应该使用StringBuilder而不是以这种方式连接字符。使用StringBuilder.append()。
StringBuilder将为您提供更好的性能。连接方式的问题是每次创建一个新的String(字符串是不可变的),然后复制旧的字符串,附加新的字符串,并抛弃旧的String。这是一个额外的工作,在一段时间内(如在一个大的for循环中)会导致性能下降。
答案 1 :(得分:5)
StringUtils
或来自番石榴的Strings
是你的朋友。如前所述避免字符串连接。
StringUtils.repeat("a", 3) // => "aaa"
Strings.repeat("hey", 3) // => "heyheyhey"
答案 2 :(得分:4)
使用原始字符数组&amp;一些标准的util类,如Arrays
public class Test {
static String getPattern(int length, char character) {
char[] cArray = new char[length];
Arrays.fill(cArray, character);
// return Arrays.toString(cArray);
return new String(cArray);
}
static String buildPattern(int length, char character) {
StringBuilder sb= new StringBuilder(length);
for (int i = 0; i < length; i++) {
sb.append(character);
}
return sb.toString();
}
public static void main(String args[]){
long time = System.currentTimeMillis();
getPattern(10000000,'c');
time = System.currentTimeMillis() - time;
System.out.println(time); //prints 93
time = System.currentTimeMillis();
buildPattern(10000000,'c');
time = System.currentTimeMillis() - time;
System.out.println(time); //prints 188
}
}
编辑 Arrays.toString()性能较低,因为它最终使用了StringBuilder,但新的String实现了神奇。
答案 3 :(得分:3)
Yikes,no。
String
在java中是不可变的;你无法改变它。当你说:
result += character;
您每次都在创建一个新的String
。
您想使用StringBuilder
并附加到该String
,然后使用toString()
方法返回{{1}}。
答案 4 :(得分:2)
我认为像下面这样做会更有效率,
String getPattern(int length, char character)
{
char[] list = new char[length];
for(int i =0;i<length;i++)
{
list[i] = character;
}
return new string(list);
}
答案 5 :(得分:1)
连接字符串永远不是最有效的,因为String是不可变的,为了获得更好的性能,你应该使用StringBuilder和append()
String getPattern(int length, char character) {
StringBuilder sb= new StringBuilder(length)
for (int i = 0; i < length; i++) {
sb.append(character);
}
return sb.toString();
}
答案 6 :(得分:1)
在性能方面,我认为您可以创建更小的String
和连接(当然使用StringBuilder
),直到达到请求大小:连接/追加“zzz”到“ zzz“执行可能比连接'z'三次更好(好吧,也许不是这么小的数字,但是当你达到100左右的字符时,做十个连接'z'后跟10个连接”zzzzzzzzzz“可能比'z'的100个concatenatinos。
此外,因为您询问GWT,DevMode(纯Java)和“生产模式”(在浏览器中使用JS运行)之间的结果会有很大差异,并且可能会因浏览器而异。
真正知道的唯一方法是基准,其他一切都是纯粹的猜测
并且可能使用延迟绑定来在每个浏览器中使用性能最高的变体(这正是在GWT中模拟StringBuilder
的方式)。