Creating a random string with A-Z and 0-9 in Java
Categories:
Crafting Random Alphanumeric Strings in Java

Learn various techniques to generate random strings composed of uppercase letters (A-Z) and digits (0-9) in Java, from basic approaches to more robust and efficient solutions.
Generating random strings is a common requirement in many applications, whether for creating unique identifiers, temporary passwords, or test data. This article explores different methods in Java to produce random strings consisting solely of uppercase letters (A-Z) and digits (0-9). We'll cover approaches using java.util.Random
, java.security.SecureRandom
, and Java 8 Streams, discussing their pros and cons.
Understanding the Building Blocks: Characters and Randomness
Before diving into code, it's crucial to understand the components we'll be working with: the character set and the random number generation mechanism. Our target character set is A-Z (26 characters) and 0-9 (10 characters), totaling 36 possible characters. For randomness, Java provides java.util.Random
for general-purpose pseudo-random number generation and java.security.SecureRandom
for cryptographically strong random numbers, suitable for security-sensitive applications.
flowchart TD A[Start] B{Choose Character Set} C[A-Z (26 chars)] D[0-9 (10 chars)] E[Combine (36 chars total)] F{Choose Random Generator} G[java.util.Random] H[java.security.SecureRandom] I[Generate Random Index] J[Select Character] K[Append to String] L{Desired Length Reached?} M[End] A --> B B --> C B --> D C --> E D --> E E --> F F --> G F --> H G --> I H --> I I --> J J --> K K --> L L -- No --> I L -- Yes --> M
Workflow for generating a random alphanumeric string
Method 1: Using java.util.Random
and a Predefined Character Array
This is a straightforward and commonly used method. We define a string containing all allowed characters and then repeatedly pick a random character from this string until the desired length is reached. java.util.Random
is sufficient for most non-security-critical applications.
import java.util.Random;
public class RandomStringGenerator {
private static final String ALPHANUMERIC_CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
private static final Random random = new Random();
public static String generateRandomString(int length) {
if (length < 1) {
throw new IllegalArgumentException("Length must be at least 1.");
}
StringBuilder sb = new StringBuilder(length);
for (int i = 0; i < length; i++) {
int randomIndex = random.nextInt(ALPHANUMERIC_CHARS.length());
sb.append(ALPHANUMERIC_CHARS.charAt(randomIndex));
}
return sb.toString();
}
public static void main(String[] args) {
System.out.println("Random String (10 chars): " + generateRandomString(10));
System.out.println("Random String (5 chars): " + generateRandomString(5));
}
}
Generating a random alphanumeric string using java.util.Random
.
StringBuilder
instead of String
concatenation (+
operator) inside loops. StringBuilder
is mutable and more efficient.Method 2: Leveraging Java 8 Streams and SecureRandom
For more modern Java applications, especially when cryptographic strength is desired, Java 8 Streams combined with java.security.SecureRandom
offer a concise and powerful solution. SecureRandom
provides a cryptographically strong random number generator (RNG) suitable for security-sensitive applications like generating session keys or temporary passwords.
import java.security.SecureRandom;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
public class SecureRandomStringGenerator {
private static final String ALPHANUMERIC_CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
private static final SecureRandom secureRandom = new SecureRandom();
public static String generateSecureRandomString(int length) {
if (length < 1) {
throw new IllegalArgumentException("Length must be at least 1.");
}
return IntStream.range(0, length)
.mapToObj(i -> ALPHANUMERIC_CHARS.charAt(secureRandom.nextInt(ALPHANUMERIC_CHARS.length())))
.map(Object::toString)
.collect(Collectors.joining());
}
public static void main(String[] args) {
System.out.println("Secure Random String (12 chars): " + generateSecureRandomString(12));
System.out.println("Secure Random String (8 chars): " + generateSecureRandomString(8));
}
}
Generating a cryptographically strong random alphanumeric string using Java 8 Streams and SecureRandom
.
SecureRandom
is preferred for security, it can be slower to initialize than Random
. For non-security-critical tasks where performance is paramount, Random
might be a better choice. Avoid creating a new SecureRandom
instance repeatedly in a loop, as it can be resource-intensive.Choosing the Right Approach
The choice between Random
and SecureRandom
depends entirely on your application's requirements:
java.util.Random
: Use for general-purpose tasks like generating unique IDs for non-sensitive data, test data, or simple obfuscation. It's faster and simpler.java.security.SecureRandom
: Essential for security-sensitive applications such as generating passwords, cryptographic keys, session tokens, or any scenario where predictability could lead to vulnerabilities. It provides a higher degree of randomness, making it much harder to guess the generated strings.