首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 隨機字串產生器工具類:字母、數字、混合、定長、補零完整實作

     編輯:Java 相關知識

專案常需產生隨機字串 (驗證碼、訂單號、檔名、測試資料)。java.util.Random 為偽隨機核心,配合字元池採樣即可構建通用工具類。本文提供**執行緒安全、高效能、功能完整**的 RandomStringUtils 實作。

核心設計

  • 使用 ThreadLocalRandom (JDK 7+) 避免多執行緒爭用單一 Random 實例的效能瓶頸。
  • 預先定義字元池常量,避免重複建立字串/陣列。
  • 所有方法為 static、無狀態、可直接呼叫。

完整工具類


import java.util.concurrent.ThreadLocalRandom;

public final class RandomStringUtils {
    private RandomStringUtils() {}

    private static final String DIGITS       = "0123456789";
    private static final String LETTERS      = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
    private static final String ALPHANUMERIC = DIGITS + LETTERS;
    private static final ThreadLocalRandom RANDOM = ThreadLocalRandom.current();

    /** 任意字元池採樣 */
    private static String generate(String pool, int length) {
        if (length <= 0) return "";
        char[] buf = new char[length];
        int poolSize = pool.length();
        for (int i = 0; i < length; i++) {
            buf[i] = pool.charAt(RANDOM.nextInt(poolSize));
        }
        return new String(buf);
    }

    // ===== 公開 API =====
    public static String alphanumeric(int length) { return generate(ALPHANUMERIC, length); }
    public static String letters(int length)      { return generate(LETTERS, length); }
    public static String lowerCase(int length)    { return letters(length).toLowerCase(); }
    public static String upperCase(int length)    { return letters(length).toUpperCase(); }
    public static String numeric(int length)      { return generate(DIGITS, length); }

    /** 純零字串 */
    public static String zeros(int length) {
        if (length <= 0) return "";
        char[] buf = new char[length];
        java.util.Arrays.fill(buf, '0');
        return new String(buf);
    }

    /** 數字左補零至固定長度 */
    public static String leftPadZeros(long number, int width) {
        String s = Long.toString(number);
        if (s.length() >= width) return s;
        return zeros(width - s.length()) + s;
    }
    public static String leftPadZeros(int number, int width) {
        return leftPadZeros((long) number, width);
    }

    /** 不重複數字組合 (洗牌演算法 Fisher-Yates) */
    public static int uniqueDigits(int[] digits, int len) {
        // 洗牌
        for (int i = digits.length - 1; i > 0; i--) {
            int j = RANDOM.nextInt(i + 1);
            int tmp = digits[i]; digits[i] = digits[j]; digits[j] = tmp;
        }
        int result = 0;
        for (int i = 0; i < len; i++) result = result * 10 + digits[i];
        return result;
    }

    // 測試
    public static void main(String[] args) {
        System.out.println("alphanumeric: " + alphanumeric(16));
        System.out.println("letters:      " + letters(12));
        System.out.println("lowerCase:    " + lowerCase(10));
        System.out.println("upperCase:    " + upperCase(10));
        System.out.println("numeric:      " + numeric(8));
        System.out.println("zeros:        " + zeros(10));
        System.out.println("leftPadZeros: " + leftPadZeros(123, 10));
        System.out.println("uniqueDigits: " + uniqueDigits(new int[]{1,2,3,4,5,6,7}, 3));
    }
}

輸出範例


alphanumeric: 7xK9pL2mQ8wR4zY1
letters:      aBcDeFgHiJkL
lowerCase:    qwertyuiop
upperCase:    ASDFGHJKLZ
numeric:      83920174
zeros:        0000000000
leftPadZeros: 0000000123
uniqueDigits: 742

效能優化細節

安全性與適用場景

  • 一般業務隨機碼:本工具類足夠 (偽隨機)。
  • 加密金鑰、Token、Session ID:**必須用 java.security.SecureRandom** (密碼學安全)。
  • 分散式唯一 ID:採用 Snowflake / UUID v7 / ULID,而非單機隨機。
  • 可重現測試:需固定種子時改用 new Random(seed),不要用 ThreadLocalRandom。

SecureRandom 版本 (關鍵場景專用)


public static String secureAlphanumeric(int length) {
    SecureRandom sr = new SecureRandom();
    char[] buf = new char[length];
    for (int i = 0; i < length; i++) {
        buf[i] = ALPHANUMERIC.charAt(sr.nextInt(ALPHANUMERIC.length()));
    }
    return new String(buf);
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
優化點說明
ThreadLocalRandom每執行緒獨立 Random 實例,無 CAS 爭用,比 new Random() 快 2-3 倍
char[] 陣列 + new String避免 StringBuilder 擴容開銷,單次分配
預計算 pool.length()循環外提取,減少方法呼叫
Arrays.fillJVM 內建優化 (可能向量化)