使用指定字符填充指定长度的String的最有效方法?

时间:2011-08-29 05:58:33

标签: java performance gwt

基本上给定一个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;
}

这是我能表现得最好的吗?

7 个答案:

答案 0 :(得分:6)

您应该使用StringBuilder而不是以这种方式连接字符。使用StringBuilder.append()

StringBuilder将为您提供更好的性能。连接方式的问题是每次创建一个新的String(字符串是不可变的),然后复制旧的字符串,附加新的字符串,并抛弃旧的String。这是一个额外的工作,在一段时间内(如在一个大的for循环中)会导致性能下降。

答案 1 :(得分:5)

来自commons-lang的{p> 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是不可变的,为了获得更好的性能,你应该使用StringBuilderappend()

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的方式)。