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

Java 實戰案例:隨機驗證碼生成器實現(字符數組、Random、StringBuilder、indexOf 去重)

     編輯:Java 相關知識

本文通過一個「生成 4 位不重複字符驗證碼」的完整案例,串講 Java 基礎核心知識點:字符數組定義、`Random` 隨機數、`StringBuilder` 動態字符串構建、`indexOf` 去重邏輯、基本類型與字符串互轉三種方式、包裝類拆裝箱。適合 Java 入門者動手實踐鞏固語法。

一、效果演示

運行結果示例:
K7B2
X9P1
Q3R8
...

二、完整代碼

1. 核心工具類 RandomGen.java

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);
    }
}

2. 測試類 RandomGenDemo.java

package verificationcode;

public class RandomGenDemo {
    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            System.out.println(RandomGen.generateCode());
        }
    }
}

三、知識點深度解析

1. 字符數組與字符/字符串區別

char[] arr = {'A', 'B'};  // 單引號:char 字符
String s = "AB";          // 雙引號:String 字符串
// 錯誤:char c = "A"; // 型別不匹配

2. Random 兩種用法對比

方式代碼返回範圍適用場景
`Math.random()``(int)(Math.random() * n)`[0, n) double → int簡單臨時需求
`new Random().nextInt(n)``random.nextInt(n)`[0, n) int高頻、需指定種子、多線程

本案例用 `Random` 類,可復用實例、支援 `setSeed()` 復現測試。

3. StringBuilder vs String

  • `String` 不可變,每次 `+` 拼接產生新對象,循環中效率低。
  • `StringBuilder` 可變字符序列,`append()` 原地擴容,**單線程首選**。
  • 多線程環境用 `StringBuffer`(同步)。

4. 基本類型 → 字符串 三種方式

char c = 'A';
// 1. 包裝類 toString()
String s1 = Character.toString(c);
// 2. String.valueOf()(推薦,null 安全)
String s2 = String.valueOf(c);
// 3. 拼接空字符串(編譯器優化為 StringBuilder)
String s3 = c + "";  // 本案例使用

5. 字符串 → 基本類型 兩種方式

String numStr = "123";
// 1. 包裝類 parseXxx(拋 NumberFormatException)
int n1 = Integer.parseInt(numStr);
// 2. valueOf() 返回包裝類,自動拆箱
Integer n2 = Integer.valueOf(numStr); // 自動拆箱為 int

6. indexOf 去重邏輯

// StringBuilder.indexOf(String str) 返回首次出現索引,不存在返回 -1
if (sb.indexOf(String.valueOf(c)) == -1) {
    // 未包含,可安全添加
}

四、擴展練習建議

  1. 增加小寫字母、特殊符號擴充字符池。
  2. 使用 `Collections.shuffle(List)` 打亂字符池後取前 N 位,避免循環去重的理論無限循環風險(字符池極小時)。
  3. 生成圖形驗證碼:`BufferedImage` 繪製干擾線、噪點、扭曲文字輸出圖片流。
  4. 加入驗證碼存儲(Redis/Session)、校驗、過期銷毀邏輯。

五、總結

這個小案例雖簡單,卻涵蓋了 **數組、Random、StringBuilder、字符串查找、類型轉換、循環控制** 等 Java 基礎高頻考點。建議初學者手動敲碼、斷點調試觀察 `sb` 變化、嘗試修改字符池與長度參數,體會「動手才是真學會」。

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