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

Java 隨機字串產生器:支援字母、數字、符號任意組合的靈活工具類

     編輯:Java 程式設計入門

前言:通用的隨機字串需求

從密碼生成、驗證碼、API Token 到測試資料構造,**隨機字串**是高頻剛需。本文提供一個**型別安全、組合靈活、零依賴**的工具類,支援 8 種預設字元集組合,並可輕鬆擴展自定義字元集。

設計亮點

  • 枚舉驅動:Type 枚舉定義 8 種常用組合,型別安全,IDE 智能提示。
  • 字元集分離:小寫、大寫、數字、符號四大基礎字元集獨立陣列,組合邏輯清晰。
  • 單一 Random 實例:static final Random 避免重複種子導致序列相關性。
  • StringBuilder 高效拼接:O(N) 複雜度,無中間字串物件。
  • 可擴展:新增字元集只需加陣列與枚舉值,核心邏輯不變。

完整工具類代碼

package com.phyl.password;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Random;

public class PassWord {

    /** 字元類型枚舉:8 種預設組合 */
    public enum Type {
        LETTER,                 // 小寫字母
        CAPITAL,                // 大寫字母
        NUMBER,                 // 數字
        SIGN,                   // 符號
        LETTER_CAPITAL,         // 大小寫字母
        LETTER_NUMBER,          // 小寫字母 + 數字
        LETTER_CAPITAL_NUMBER,  // 大小寫字母 + 數字
        LETTER_CAPITAL_NUMBER_SIGN // 全字元集
    }

    // 四大基礎字元集
    private static final String[] LOWERCASE = {
        "a","b","c","d","e","f","g","h","i","j","k","l","m",
        "n","o","p","q","r","s","t","u","v","w","x","y","z"
    };
    private static final String[] CAPITAL = {
        "A","B","C","D","E","F","G","H","I","J","K","L","M",
        "N","O","P","Q","R","S","T","U","V","W","X","Y","Z"
    };
    private static final String[] NUMBER = {
        "0","1","2","3","4","5","6","7","8","9"
    };
    private static final String[] SIGN = {
        "~","!","@","#","$","%","^","&","*","(",")","_","+","`","-","=",
        "{","}","|",":","\"","<",">","?","[","]","\\",";","'",",",".","/"
    };

    private static final Random RANDOM = new Random();

    /** 核心生成方法
     * @param length 字串長度
     * @param type 字元類型組合
     * @return 隨機字串
     */
    public static String getRandom(int length, Type type) {
        if (length <= 0) return "";

        ArrayList pool = new ArrayList<>();
        switch (type) {
            case LETTER: pool.addAll(Arrays.asList(LOWERCASE)); break;
            case CAPITAL: pool.addAll(Arrays.asList(CAPITAL)); break;
            case NUMBER: pool.addAll(Arrays.asList(NUMBER)); break;
            case SIGN: pool.addAll(Arrays.asList(SIGN)); break;
            case LETTER_CAPITAL:
                pool.addAll(Arrays.asList(LOWERCASE));
                pool.addAll(Arrays.asList(CAPITAL));
                break;
            case LETTER_NUMBER:
                pool.addAll(Arrays.asList(LOWERCASE));
                pool.addAll(Arrays.asList(NUMBER));
                break;
            case LETTER_CAPITAL_NUMBER:
                pool.addAll(Arrays.asList(LOWERCASE));
                pool.addAll(Arrays.asList(CAPITAL));
                pool.addAll(Arrays.asList(NUMBER));
                break;
            case LETTER_CAPITAL_NUMBER_SIGN:
                pool.addAll(Arrays.asList(LOWERCASE));
                pool.addAll(Arrays.asList(CAPITAL));
                pool.addAll(Arrays.asList(NUMBER));
                pool.addAll(Arrays.asList(SIGN));
                break;
        }

        StringBuilder sb = new StringBuilder(length);
        int poolSize = pool.size();
        for (int i = 0; i < length; i++) {
            sb.append(pool.get(RANDOM.nextInt(poolSize)));
        }
        return sb.toString();
    }

    /** 便利方法:自定義字元集
     * @param length 長度
     * @param chars 字元陣列(如 "abc123".split(""))
     * @return 隨機字串
     */
    public static String getRandom(int length, String[] chars) {
        if (length <= 0 || chars == null || chars.length == 0) return "";
        StringBuilder sb = new StringBuilder(length);
        for (int i = 0; i < length; i++) {
            sb.append(chars[RANDOM.nextInt(chars.length)]);
        }
        return sb.toString();
    }

    // 測試主程式
    public static void main(String[] args) {
        System.out.println("純大寫 24 碼: " + getRandom(24, Type.CAPITAL));
        System.out.println("大小寫+數字 16 碼: " + getRandom(16, Type.LETTER_CAPITAL_NUMBER));
        System.out.println("全字元集 32 碼: " + getRandom(32, Type.LETTER_CAPITAL_NUMBER_SIGN));
        System.out.println("自定義字元集 (HEX): " + getRandom(16, new String[]{"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"}));
    }
}

使用範例與輸出

// 主程式輸出範例
純大寫 24 碼: XKJQZPMVFRWBNLTDHYSCGAUI
大小寫+數字 16 碼: aK7mP2xR9qL1nZ4b
全字元集 32 碼: K8#mP@2xR!9qL$1nZ%4b^&*()
自定義字元集 (HEX): 3F7A1C9E0B5D2F48

進階擴展建議

需求實作方向
密碼學級安全改用 SecureRandom,移除 Random
排除易混淆字元字元集移除 0,O,o,1,l,I,|,!,...
保證包含各類字元Shuffle 字元集,強制取各類至少一個,再隨機補齊
可配置權重字元集改為 Map 權重,按權重採樣
批量生成不重複搭配 Set 去重,或用 UUID/雪花算法

安全性提醒

  • 一般業務(驗證碼、測試資料、檔名)**Random 足夠**。
  • 密碼、Token、Session ID、加密金鑰**必須用 SecureRandom**
  • 生成密碼時建議:長度 ≥ 16、包含四類字元、排除易混淆字元、使用 SecureRandom。

總結

PassWord 工具類以**枚舉驅動型別安全**、**基礎字元集組合靈活**、**StringBuilder 高效拼接**三大特點,滿足 90%+ 業務場景的隨機字串需求。代碼零依賴、單檔即用,易於複製到任意專案或封裝為共用庫。對於安全敏感場景,只需將 Random 替換為 SecureRandom 即可平滑升級。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved