如何优化我的代码以便在Java中高速生成伪随机字符串?

时间:2014-05-01 12:13:55

标签: java loops optimization random

我的目标是生成一个伪随机字符串,该字符串由少量字符组成,包含500000个字符。这是我在字符串中添加字符的循环:

String alphabet="ABCD";
Random r = new Random();
for (int i = 0; i < 500000; i++) {
    this.setCode((this.getCode() == null ? "" : this.getCode())
    alphabet.charAt(r.nextInt(alphabet.length())));
}

毫不奇怪,这是非常缓慢的,所以我正在寻找方法来实现这个&gt;最慢的&lt;可能的。

3 个答案:

答案 0 :(得分:4)

使用StringBuilder构建字符串。预先分配500000个字符以加快速度:

StringBuilder sb = new StringBuilder(500000);
for (int i = 0; i < 500000; i++) {
    sb.append(alphabet.charAt(r.nextInt(alphabet.length())));
}
String res = sb.toString();

答案 1 :(得分:2)

如果您愿意使用第三方库,请查看Apache Commons RandomStringUtils

int count = 500000;
String alphabet = "ABCD";
String randomString = RandomStringUtils.random(count, alphabet);

在我的笔记本电脑(MacBook Pro)上,生成500K字符串需要大约20ms。

答案 2 :(得分:1)

使用StringBuilder会有所帮助,但如果您将初始大小声明为预期输出的实际长度,则会更有帮助。这避免了在运行时调整StringBuilder的内部数组的大小。此外,直接访问String的char数组比在charAt(int)上使用String快一点 - 引用是直接的,而不是对数组进行方法引用。

 public static String getRandomString(String characterSet){
    final char[] chars = characterSet.toCharArray();
    final int size = 500000;
    StringBuilder sb = new StringBuilder(size);
    Random rand = new Random();
    for(int i=0;i<size;i++){
        sb.append(chars[rand.nextInt(chars.length)]);
    }
    return sb.toString();
}