我的目标是生成一个伪随机字符串,该字符串由少量字符组成,包含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;可能的。
答案 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();
}