從密碼生成、驗證碼、API Token 到測試資料構造,**隨機字串**是高頻剛需。本文提供一個**型別安全、組合靈活、零依賴**的工具類,支援 8 種預設字元集組合,並可輕鬆擴展自定義字元集。
Type 枚舉定義 8 種常用組合,型別安全,IDE 智能提示。static final Random 避免重複種子導致序列相關性。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 足夠**。SecureRandom**SecureRandom。PassWord 工具類以**枚舉驅動型別安全**、**基礎字元集組合靈活**、**StringBuilder 高效拼接**三大特點,滿足 90%+ 業務場景的隨機字串需求。代碼零依賴、單檔即用,易於複製到任意專案或封裝為共用庫。對於安全敏感場景,只需將 Random 替換為 SecureRandom 即可平滑升級。