Everything Java

← Back to blog

Published on Sat May 03 2025 10:00:00 GMT+0000 (Coordinated Universal Time) by Purusothaman Ramanujam

Random Utilities in Apache Commons Lang

Introduction

Generating random data is a common requirement in Java applications, whether for testing, creating unique identifiers, or generating sample data. Apache Commons Lang’s RandomStringUtils provides a comprehensive set of utilities that make random string generation easy, flexible, and secure.

In this comprehensive guide, you’ll learn how to use RandomStringUtils effectively with detailed examples and real-world use cases.

Adding Apache Commons Lang to Your Project

Maven Dependency

<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.13.0</version>
</dependency>

Gradle Dependency

implementation 'org.apache.commons:commons-lang3:3.13.0'

Basic Random String Generation

Simple Random Strings

import org.apache.commons.lang3.RandomStringUtils;
public class BasicRandomGeneration {
public static void main(String[] args) {
// Generate random alphanumeric string
String randomAlphanumeric = RandomStringUtils.randomAlphanumeric(10);
System.out.println("Random alphanumeric: " + randomAlphanumeric);
// Generate random alphabetic string
String randomAlphabetic = RandomStringUtils.randomAlphabetic(8);
System.out.println("Random alphabetic: " + randomAlphabetic);
// Generate random numeric string
String randomNumeric = RandomStringUtils.randomNumeric(6);
System.out.println("Random numeric: " + randomNumeric);
// Generate random ASCII string
String randomAscii = RandomStringUtils.randomAscii(12);
System.out.println("Random ASCII: " + randomAscii);
// Generate random string with custom characters
String customChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
String randomCustom = RandomStringUtils.random(8, customChars);
System.out.println("Random custom: " + randomCustom);
}
}

Advanced Random Generation

public class AdvancedRandomGeneration {
public static void main(String[] args) {
// Generate random string with specific character sets
String letters = RandomStringUtils.randomAlphabetic(10);
String numbers = RandomStringUtils.randomNumeric(5);
String alphanumeric = RandomStringUtils.randomAlphanumeric(15);
System.out.println("Letters: " + letters);
System.out.println("Numbers: " + numbers);
System.out.println("Alphanumeric: " + alphanumeric);
// Generate random string with mixed case
String mixedCase = RandomStringUtils.randomAlphabetic(10).toLowerCase();
System.out.println("Mixed case: " + mixedCase);
// Generate random string with specific length range
int minLength = 5;
int maxLength = 15;
int randomLength = (int) (Math.random() * (maxLength - minLength + 1)) + minLength;
String variableLength = RandomStringUtils.randomAlphanumeric(randomLength);
System.out.println("Variable length (" + randomLength + "): " + variableLength);
}
}

Character Set Specific Generation

Different Character Types

public class CharacterSetGeneration {
public static void main(String[] args) {
// Generate only uppercase letters
String uppercase = RandomStringUtils.random(10, true, false);
System.out.println("Uppercase only: " + uppercase);
// Generate only lowercase letters
String lowercase = RandomStringUtils.random(10, false, true);
System.out.println("Lowercase only: " + lowercase);
// Generate mixed case letters
String mixedCase = RandomStringUtils.random(10, true, true);
System.out.println("Mixed case: " + mixedCase);
// Generate with specific character sets
String vowels = "AEIOU";
String consonants = "BCDFGHJKLMNPQRSTVWXYZ";
String randomVowels = RandomStringUtils.random(5, vowels);
String randomConsonants = RandomStringUtils.random(8, consonants);
System.out.println("Random vowels: " + randomVowels);
System.out.println("Random consonants: " + randomConsonants);
// Generate with custom character set
String hexChars = "0123456789ABCDEF";
String randomHex = RandomStringUtils.random(8, hexChars);
System.out.println("Random hex: " + randomHex);
}
}

Specialized Character Sets

public class SpecializedGeneration {
public static void main(String[] args) {
// Generate random email addresses
String email = generateRandomEmail();
System.out.println("Random email: " + email);
// Generate random phone numbers
String phone = generateRandomPhone();
System.out.println("Random phone: " + phone);
// Generate random usernames
String username = generateRandomUsername();
System.out.println("Random username: " + username);
// Generate random passwords
String password = generateRandomPassword();
System.out.println("Random password: " + password);
}
public static String generateRandomEmail() {
String username = RandomStringUtils.randomAlphanumeric(8).toLowerCase();
String domain = RandomStringUtils.randomAlphanumeric(6).toLowerCase();
String tld = RandomStringUtils.random(3, "abcdefghijklmnopqrstuvwxyz");
return username + "@" + domain + "." + tld;
}
public static String generateRandomPhone() {
String areaCode = RandomStringUtils.randomNumeric(3);
String prefix = RandomStringUtils.randomNumeric(3);
String lineNumber = RandomStringUtils.randomNumeric(4);
return "(" + areaCode + ") " + prefix + "-" + lineNumber;
}
public static String generateRandomUsername() {
String prefix = RandomStringUtils.randomAlphabetic(5).toLowerCase();
String suffix = RandomStringUtils.randomNumeric(3);
return prefix + suffix;
}
public static String generateRandomPassword() {
String letters = RandomStringUtils.randomAlphabetic(6);
String numbers = RandomStringUtils.randomNumeric(2);
String special = RandomStringUtils.random(2, "!@#$%^&*");
return letters + numbers + special;
}
}

Testing Data Generation

Test Data Creation

import java.util.ArrayList;
import java.util.List;
public class TestDataGeneration {
public static class User {
private String id;
private String name;
private String email;
private String phone;
public User(String id, String name, String email, String phone) {
this.id = id;
this.name = name;
this.email = email;
this.phone = phone;
}
@Override
public String toString() {
return String.format("User{id='%s', name='%s', email='%s', phone='%s'}",
id, name, email, phone);
}
}
public static List<User> generateTestUsers(int count) {
List<User> users = new ArrayList<>();
for (int i = 0; i < count; i++) {
String id = RandomStringUtils.randomAlphanumeric(8).toUpperCase();
String name = generateRandomName();
String email = generateRandomEmail();
String phone = generateRandomPhone();
users.add(new User(id, name, email, phone));
}
return users;
}
public static String generateRandomName() {
String[] firstNames = {"John", "Jane", "Mike", "Sarah", "David", "Lisa", "Tom", "Emma"};
String[] lastNames = {"Smith", "Johnson", "Williams", "Brown", "Jones", "Garcia", "Miller"};
String firstName = firstNames[(int) (Math.random() * firstNames.length)];
String lastName = lastNames[(int) (Math.random() * lastNames.length)];
return firstName + " " + lastName;
}
public static void main(String[] args) {
List<User> testUsers = generateTestUsers(5);
for (User user : testUsers) {
System.out.println(user);
}
}
}

Database Test Data

public class DatabaseTestData {
public static String generateRandomUUID() {
return RandomStringUtils.randomAlphanumeric(8) + "-" +
RandomStringUtils.randomAlphanumeric(4) + "-" +
RandomStringUtils.randomAlphanumeric(4) + "-" +
RandomStringUtils.randomAlphanumeric(4) + "-" +
RandomStringUtils.randomAlphanumeric(12);
}
public static String generateRandomDate() {
int year = 2020 + (int) (Math.random() * 5);
int month = 1 + (int) (Math.random() * 12);
int day = 1 + (int) (Math.random() * 28);
return String.format("%04d-%02d-%02d", year, month, day);
}
public static String generateRandomTimestamp() {
String date = generateRandomDate();
int hour = (int) (Math.random() * 24);
int minute = (int) (Math.random() * 60);
int second = (int) (Math.random() * 60);
return String.format("%s %02d:%02d:%02d", date, hour, minute, second);
}
public static void main(String[] args) {
System.out.println("Random UUID: " + generateRandomUUID());
System.out.println("Random Date: " + generateRandomDate());
System.out.println("Random Timestamp: " + generateRandomTimestamp());
}
}

Secure Random Generation

Cryptographically Secure Random

import java.security.SecureRandom;
public class SecureRandomGeneration {
public static void main(String[] args) {
// Use SecureRandom for cryptographic purposes
SecureRandom secureRandom = new SecureRandom();
// Generate secure random strings
String secureAlphanumeric = RandomStringUtils.random(16, 0, 0, true, true, null, secureRandom);
System.out.println("Secure alphanumeric: " + secureAlphanumeric);
// Generate secure random numeric string
String secureNumeric = RandomStringUtils.random(8, 0, 0, false, true, null, secureRandom);
System.out.println("Secure numeric: " + secureNumeric);
// Generate secure random alphabetic string
String secureAlphabetic = RandomStringUtils.random(12, 0, 0, true, false, null, secureRandom);
System.out.println("Secure alphabetic: " + secureAlphabetic);
}
}

Token Generation

public class TokenGeneration {
public static String generateAccessToken() {
return RandomStringUtils.randomAlphanumeric(32);
}
public static String generateRefreshToken() {
return RandomStringUtils.randomAlphanumeric(64);
}
public static String generateApiKey() {
return RandomStringUtils.randomAlphanumeric(24).toUpperCase();
}
public static String generateSessionId() {
return RandomStringUtils.randomAlphanumeric(16);
}
public static void main(String[] args) {
System.out.println("Access Token: " + generateAccessToken());
System.out.println("Refresh Token: " + generateRefreshToken());
System.out.println("API Key: " + generateApiKey());
System.out.println("Session ID: " + generateSessionId());
}
}

Performance and Memory Considerations

Efficient Random Generation

public class PerformanceOptimization {
public static void main(String[] args) {
// For bulk generation, reuse Random instance
java.util.Random random = new java.util.Random();
// Generate multiple strings efficiently
for (int i = 0; i < 10; i++) {
String randomString = RandomStringUtils.random(8, 0, 0, true, true, null, random);
System.out.println("Random string " + (i + 1) + ": " + randomString);
}
// Generate large amounts of data
List<String> bulkData = generateBulkData(1000, 10);
System.out.println("Generated " + bulkData.size() + " random strings");
}
public static List<String> generateBulkData(int count, int length) {
List<String> data = new ArrayList<>();
java.util.Random random = new java.util.Random();
for (int i = 0; i < count; i++) {
data.add(RandomStringUtils.random(length, 0, 0, true, true, null, random));
}
return data;
}
}

Real-World Examples

Mock Data Service

import java.util.HashMap;
import java.util.Map;
public class MockDataService {
public static Map<String, Object> generateMockUser() {
Map<String, Object> user = new HashMap<>();
user.put("id", RandomStringUtils.randomAlphanumeric(8).toUpperCase());
user.put("username", RandomStringUtils.randomAlphanumeric(8).toLowerCase());
user.put("email", generateRandomEmail());
user.put("firstName", RandomStringUtils.randomAlphabetic(6).toLowerCase());
user.put("lastName", RandomStringUtils.randomAlphabetic(8).toLowerCase());
user.put("phone", generateRandomPhone());
user.put("address", generateRandomAddress());
user.put("createdAt", generateRandomTimestamp());
return user;
}
public static String generateRandomAddress() {
String number = RandomStringUtils.randomNumeric(3);
String street = RandomStringUtils.randomAlphabetic(8).toLowerCase();
String city = RandomStringUtils.randomAlphabetic(6).toLowerCase();
String state = RandomStringUtils.randomAlphabetic(2).toUpperCase();
String zip = RandomStringUtils.randomNumeric(5);
return number + " " + street + " St, " + city + ", " + state + " " + zip;
}
public static void main(String[] args) {
for (int i = 0; i < 3; i++) {
Map<String, Object> mockUser = generateMockUser();
System.out.println("Mock User " + (i + 1) + ": " + mockUser);
}
}
}

Configuration Testing

public class ConfigurationTesting {
public static String generateTestConfig() {
StringBuilder config = new StringBuilder();
// Generate random configuration values
config.append("server.port=").append(RandomStringUtils.randomNumeric(4)).append("\n");
config.append("database.url=jdbc:mysql://localhost:").append(RandomStringUtils.randomNumeric(4)).append("/testdb\n");
config.append("api.key=").append(RandomStringUtils.randomAlphanumeric(32)).append("\n");
config.append("session.timeout=").append(RandomStringUtils.randomNumeric(4)).append("\n");
config.append("log.level=").append(RandomStringUtils.random(4, "DEBUGINFOERROR")).append("\n");
return config.toString();
}
public static void main(String[] args) {
String testConfig = generateTestConfig();
System.out.println("Test Configuration:");
System.out.println(testConfig);
}
}

Best Practices

Guidelines for Random Generation

public class BestPractices {
public static void main(String[] args) {
// 1. Use appropriate character sets for your use case
String password = generateSecurePassword();
System.out.println("Secure password: " + password);
// 2. Consider length requirements
String shortId = RandomStringUtils.randomAlphanumeric(6);
String longToken = RandomStringUtils.randomAlphanumeric(32);
System.out.println("Short ID: " + shortId);
System.out.println("Long token: " + longToken);
// 3. Use SecureRandom for security-sensitive data
String secureToken = generateSecureToken();
System.out.println("Secure token: " + secureToken);
// 4. Validate generated data
String testData = RandomStringUtils.randomAlphanumeric(10);
System.out.println("Generated data: " + testData);
System.out.println("Is valid: " + isValidGeneratedData(testData));
}
public static String generateSecurePassword() {
String uppercase = RandomStringUtils.randomAlphabetic(3).toUpperCase();
String lowercase = RandomStringUtils.randomAlphabetic(3).toLowerCase();
String numbers = RandomStringUtils.randomNumeric(2);
String special = RandomStringUtils.random(2, "!@#$%^&*");
return uppercase + lowercase + numbers + special;
}
public static String generateSecureToken() {
SecureRandom secureRandom = new SecureRandom();
return RandomStringUtils.random(32, 0, 0, true, true, null, secureRandom);
}
public static boolean isValidGeneratedData(String data) {
return data != null && data.length() >= 6 && data.matches(".*[A-Z].*") && data.matches(".*[a-z].*") && data.matches(".*\\d.*");
}
}

Common Pitfalls

Avoiding Common Mistakes

public class CommonPitfalls {
public static void main(String[] args) {
// Pitfall 1: Not considering character set requirements
String weakPassword = RandomStringUtils.randomAlphanumeric(8);
System.out.println("Weak password: " + weakPassword);
String strongPassword = generateStrongPassword();
System.out.println("Strong password: " + strongPassword);
// Pitfall 2: Using predictable random for security
String predictableToken = RandomStringUtils.randomAlphanumeric(16);
System.out.println("Predictable token: " + predictableToken);
String secureToken = generateSecureToken();
System.out.println("Secure token: " + secureToken);
// Pitfall 3: Not validating generated data
String invalidData = RandomStringUtils.randomAscii(10);
System.out.println("Invalid data: " + invalidData);
String validData = RandomStringUtils.randomAlphanumeric(10);
System.out.println("Valid data: " + validData);
}
public static String generateStrongPassword() {
String uppercase = RandomStringUtils.randomAlphabetic(2).toUpperCase();
String lowercase = RandomStringUtils.randomAlphabetic(2).toLowerCase();
String numbers = RandomStringUtils.randomNumeric(2);
String special = RandomStringUtils.random(2, "!@#$%^&*");
return uppercase + lowercase + numbers + special;
}
public static String generateSecureToken() {
SecureRandom secureRandom = new SecureRandom();
return RandomStringUtils.random(32, 0, 0, true, true, null, secureRandom);
}
}

Conclusion

RandomStringUtils from Apache Commons Lang provides a powerful and flexible set of utilities for generating random strings. By understanding these methods and their proper usage, you can create robust test data, secure tokens, and unique identifiers efficiently.

The key benefits include:

Start incorporating RandomStringUtils into your projects and see how it simplifies your random data generation needs!

Resources

Written by Purusothaman Ramanujam

← Back to blog