本文通過一個「生成 4 位不重複字符驗證碼」的完整案例,串講 Java 基礎核心知識點:字符數組定義、`Random` 隨機數、`StringBuilder` 動態字符串構建、`indexOf` 去重邏輯、基本類型與字符串互轉三種方式、包裝類拆裝箱。適合 Java 入門者動手實踐鞏固語法。
運行結果示例: K7B2 X9P1 Q3R8 ...
package verificationcode;
import java.util.Random;
public class RandomGen {
// 候選字符池:大寫字母 A-Z + 數字 1-9(排除 0/O/I 等易混淆字符可自行擴展)
private static final char[] CODE_SEQUENCE = {
'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',
'1','2','3','4','5','6','7','8','9'
};
public static String generateCode(int length) {
if (length <= 0 || length > CODE_SEQUENCE.length) {
throw new IllegalArgumentException("長度需在 1-" + CODE_SEQUENCE.length + " 之間");
}
Random random = new Random();
StringBuilder sb = new StringBuilder(); // 線程不安全但單線程高效
int count = 0;
while (count < length) {
// 1. 隨機索引
int idx = random.nextInt(CODE_SEQUENCE.length);
char c = CODE_SEQUENCE[idx];
// 2. 去重:sb 中不存在該字符
// char + "" 快速轉字符串,或 String.valueOf(c)
if (sb.indexOf(String.valueOf(c)) == -1) {
sb.append(c);
count++;
}
}
return sb.toString();
}
// 重載預設 4 位
public static String generateCode() {
return generateCode(4);
}
}
package verificationcode;
public class RandomGenDemo {
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
System.out.println(RandomGen.generateCode());
}
}
}
char[] arr = {'A', 'B'}; // 單引號:char 字符
String s = "AB"; // 雙引號:String 字符串
// 錯誤:char c = "A"; // 型別不匹配
| 方式 | 代碼 | 返回範圍 | 適用場景 |
|---|---|---|---|
| `Math.random()` | `(int)(Math.random() * n)` | [0, n) double → int | 簡單臨時需求 |
| `new Random().nextInt(n)` | `random.nextInt(n)` | [0, n) int | 高頻、需指定種子、多線程 |
本案例用 `Random` 類,可復用實例、支援 `setSeed()` 復現測試。
char c = 'A'; // 1. 包裝類 toString() String s1 = Character.toString(c); // 2. String.valueOf()(推薦,null 安全) String s2 = String.valueOf(c); // 3. 拼接空字符串(編譯器優化為 StringBuilder) String s3 = c + ""; // 本案例使用
String numStr = "123"; // 1. 包裝類 parseXxx(拋 NumberFormatException) int n1 = Integer.parseInt(numStr); // 2. valueOf() 返回包裝類,自動拆箱 Integer n2 = Integer.valueOf(numStr); // 自動拆箱為 int
// StringBuilder.indexOf(String str) 返回首次出現索引,不存在返回 -1
if (sb.indexOf(String.valueOf(c)) == -1) {
// 未包含,可安全添加
}
這個小案例雖簡單,卻涵蓋了 **數組、Random、StringBuilder、字符串查找、類型轉換、循環控制** 等 Java 基礎高頻考點。建議初學者手動敲碼、斷點調試觀察 `sb` 變化、嘗試修改字符池與長度參數,體會「動手才是真學會」。