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 的项目,导入即可运行。


原始标题:Java - Generate Random String

» 下一篇: Baeldung Weekly 40