1. 简介
在这篇文章中,我们将学习如何在 Java 中生成随机字符串。我们会从原生 Java 标准库开始,接着看下 Java 8 的写法,最后再介绍使用 Apache Commons Lang 库 的方式。
本文是 Baeldung 网站上 “Java – Back to Basic” 系列 的一部分。
2. 使用原生 Java 生成无边界随机字符串
先来个简单的,生成一个最多 7 个字符的随机字符串:
@Test
public void givenUsingPlainJava_whenGeneratingRandomStringUnbounded_thenCorrect() {
byte[] array = new byte[7]; // 长度限定为 7
new Random().nextBytes(array);
String generatedString = new String(array, Charset.forName("UTF-8"));
System.out.println(generatedString);
}
⚠️ 注意:这个生成的字符串可能包含不可打印字符,并不是我们通常说的“字母数字”字符串。
3. 使用原生 Java 生成有边界随机字符串
接下来我们生成一个更可控的随机字符串,比如只包含小写字母,长度固定为 10:
@Test
public void givenUsingPlainJava_whenGeneratingRandomStringBounded_thenCorrect() {
int leftLimit = 97; // 字符 'a'
int rightLimit = 122; // 字符 'z'
int targetStringLength = 10;
Random random = new Random();
StringBuilder buffer = new StringBuilder(targetStringLength);
for (int i = 0; i < targetStringLength; i++) {
int randomLimitedInt = leftLimit + (int)
(random.nextFloat() * (rightLimit - leftLimit + 1));
buffer.append((char) randomLimitedInt);
}
String generatedString = buffer.toString();
System.out.println(generatedString);
}
✅ 这种方式虽然代码稍长,但控制力强,适合对字符范围有特殊要求的场景。
4. 使用 Java 8 生成字母字符串
Java 8 引入了 Random.ints()
方法,可以更优雅地生成随机字符串:
@Test
public void givenUsingJava8_whenGeneratingRandomAlphabeticString_thenCorrect() {
int leftLimit = 97; // 'a'
int rightLimit = 122; // 'z'
int targetStringLength = 10;
Random random = new Random();
String generatedString = random.ints(leftLimit, rightLimit + 1)
.limit(targetStringLength)
.collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append)
.toString();
System.out.println(generatedString);
}
5. 使用 Java 8 生成字母数字字符串
如果要生成包含数字和字母的字符串,可以扩展字符范围并加上过滤:
@Test
public void givenUsingJava8_whenGeneratingRandomAlphanumericString_thenCorrect() {
int leftLimit = 48; // '0'
int rightLimit = 122; // 'z'
int targetStringLength = 10;
Random random = new Random();
String generatedString = random.ints(leftLimit, rightLimit + 1)
.filter(i -> (i <= 57 || i >= 65) && (i <= 90 || i >= 97))
.limit(targetStringLength)
.collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append)
.toString();
System.out.println(generatedString);
}
📌 这里通过 filter
过滤掉 ASCII 中的非字母数字字符,保证生成结果的干净。
6. 使用 Apache Commons Lang 生成有边界字符串
如果你引入了 Apache Commons Lang,事情就变得非常简单了。比如只生成字母字符串:
@Test
public void givenUsingApache_whenGeneratingRandomStringBounded_thenCorrect() {
int length = 10;
boolean useLetters = true;
boolean useNumbers = false;
String generatedString = RandomStringUtils.random(length, useLetters, useNumbers);
System.out.println(generatedString);
}
✅ 一行搞定,简单粗暴。
7. 使用 Apache Commons 生成纯字母字符串
还可以更简洁一点,只生成字母字符串:
@Test
public void givenUsingApache_whenGeneratingRandomAlphabeticString_thenCorrect() {
String generatedString = RandomStringUtils.randomAlphabetic(10);
System.out.println(generatedString);
}
8. 使用 Apache Commons 生成字母数字字符串
最后是生成字母数字混合的字符串:
@Test
public void givenUsingApache_whenGeneratingRandomAlphanumericString_thenCorrect() {
String generatedString = RandomStringUtils.randomAlphanumeric(10);
System.out.println(generatedString);
}
9. 总结
我们通过不同方式展示了如何生成有边界和无边界的随机字符串,包括:
- ✅ 原生 Java 实现(兼容性好)
- ✅ Java 8 Stream 风格(代码更现代)
- ✅ Apache Commons(最简洁)
📌 最后提醒一点:这些例子中使用的 java.util.Random
并不适用于加密相关场景。如果你需要生成安全相关的随机字符串,请使用 java.security.SecureRandom
。
所有示例代码都可以在 GitHub 项目 中找到,这是一个基于 Maven 的项目,导入即可运行。