1. 序章

このチュートリアルでは、Javaでランダムな文字列を生成する方法を学習します。最初に、標準のJavaライブラリを使用し、次にJava 8バリアントを使用し、最後に ApacheCommonsLangライブラリを使用します。

この記事は、ここBaeldungの「Java –BacktoBasic」シリーズの一部です。

2. プレーンJavaでランダムな無制限の文字列を生成する

簡単に始めて、7文字に制限されたランダムなStringを生成しましょう。

@Test
public void givenUsingPlainJava_whenGeneratingRandomStringUnbounded_thenCorrect() {
    byte[] array = new byte[7]; // length is bounded by 7
    new Random().nextBytes(array);
    String generatedString = new String(array, Charset.forName("UTF-8"));

    System.out.println(generatedString);
}

新しい文字列は、リモートでは英数字ではないことに注意してください。

3. プレーンJavaでランダムな境界文字列を生成する

次に、より制約のあるランダムな文字列を作成する方法を見てみましょう。 小文字のアルファベットと設定された長さを使用して、ランダムなStringを生成します。

@Test
public void givenUsingPlainJava_whenGeneratingRandomStringBounded_thenCorrect() {
 
    int leftLimit = 97; // letter 'a'
    int rightLimit = 122; // letter '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. Java8でランダムなアルファベット文字列を生成する

次に、JDK8で追加されたRandom.ints を使用して、アルファベットの String:を生成しましょう。

@Test
public void givenUsingJava8_whenGeneratingRandomAlphabeticString_thenCorrect() {
    int leftLimit = 97; // letter 'a'
    int rightLimit = 122; // letter '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. Java8でランダムな英数字の文字列を生成する

次に、英数字の String:を取得するために、文字セットを広げることができます。

@Test
public void givenUsingJava8_whenGeneratingRandomAlphanumericString_thenCorrect() {
    int leftLimit = 48; // numeral '0'
    int rightLimit = 122; // letter '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メソッドを使用して、範囲外の文字を回避するために65〜90のUnicode文字を除外しました。

6. ApacheCommonsLangを使用して境界付きランダム文字列を生成する

ApacheのCommonsLangライブラリは、ランダムな文字列の生成に大いに役立ちます。 文字のみを使用して境界付き文字列を生成するを見てみましょう。

@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);
}

したがって、Javaの例のすべての低レベルのコードの代わりに、これは単純なワンライナーで実行されます。

7. ApacheCommonsLangでアルファベット文字列を生成する

別の非常に単純な例を次に示します。今回は、アルファベット文字のみを使用し、ブールフラグをAPIに渡さない境界付きのStringです。

@Test
public void givenUsingApache_whenGeneratingRandomAlphabeticString_thenCorrect() {
    String generatedString = RandomStringUtils.randomAlphabetic(10);

    System.out.println(generatedString);
}

8. ApacheCommonsLangを使用して英数字の文字列を生成する

最後に、同じランダム境界の String、がありますが、今回は数値です。

@Test
public void givenUsingApache_whenGeneratingRandomAlphanumericString_thenCorrect() {
    String generatedString = RandomStringUtils.randomAlphanumeric(10);

    System.out.println(generatedString);
}

これで、プレーンJava、Java 8バリアント、またはApacheCommonsLibraryのいずれかを使用して制限付きおよび制限なしの文字列を作成できます。

9. 結論

さまざまな実装方法を通じて、プレーンJava、Java 8バリアント、またはApacheCommonsLibraryを使用してバインドされた文字列とバインドされていない文字列を生成することができました。

これらのJavaの例では、 java.util.Random を使用しましたが、言及する価値のある1つのポイントは、暗号的に安全ではないということです。 セキュリティに敏感なアプリケーションの代わりにjava.security.SecureRandomを使用することを検討してください。

これらすべての例とスニペットの実装は、GitHubプロジェクトにあります。 これはMavenベースのプロジェクトであるため、インポートと実行が簡単である必要があります。