驗證碼、臨時密碼、唯一標識、測試數據生成等場景常需隨機字符串。本文提供三種靈活實現:字母數字混合、純數字、可配置字符池。
public static String getRandomChar(int length) {
char[] pool = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray();
Random random = new Random();
StringBuilder sb = new StringBuilder(length);
for (int i = 0; i < length; i++) {
sb.append(pool[random.nextInt(pool.length)]);
}
return sb.toString();
}
// 默認 10 位
public static String getRandomChar() { return getRandomChar(10); }
// 寫法一:直接 nextInt(10)
public static String getRandomNumber(int length) {
Random random = new Random();
StringBuilder sb = new StringBuilder(length);
for (int i = 0; i < length; i++) sb.append(random.nextInt(10));
return sb.toString();
}
// 寫法二:字符池復用(推薦,易擴展)
public static String getRandomNumber(int length) {
return getRandomString(length, "0123456789");
}
public static String getRandomString(int length, String pool) {
if (pool == null || pool.isEmpty()) throw new IllegalArgumentException("Pool empty");
Random random = new Random();
StringBuilder sb = new StringBuilder(length);
for (int i = 0; i < length; i++) {
sb.append(pool.charAt(random.nextInt(pool.length)));
}
return sb.toString();
}
Random 線程安全但高併發下有爭用,建議用 ThreadLocalRandom(JDK 7+)。SecureRandom。StringBuilder、復用字符數組、考慮位運算優化。public final class RandomStringUtils {
private static final String ALPHANUMERIC = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
private static final String NUMERIC = "0123456789";
private static final Random RANDOM = new Random(); // 或 ThreadLocalRandom.current()
public static String randomAlphanumeric(int len) { return random(len, ALPHANUMERIC); }
public static String randomNumeric(int len) { return random(len, NUMERIC); }
public static String random(int len, String pool) { /* ... */ }
// 安全版本
public static String secureAlphanumeric(int len) { /* SecureRandom 實現 */ }
}
根據業務安全等級選擇 Random/ThreadLocalRandom/SecureRandom,封裝通用字符池方法,滿足各類隨機字符串生成需求。