在研究 KMP 算法時,對比 JDK 原生 String.indexOf()、暴力匹配(BF)、KMP 三種字符串查找算法的實際性能表現。
public class StringSearchBenchmark {
// 測試參數
private static final int TEXT_LENGTH = 8_000_000; // 主串 800 萬字符
private static final int PATTERN_LENGTH = 11; // 模式串 11 字符
private static final int CHAR_SET_SIZE = 4; // 字符集大小 (A-Z, a-z, 0-9)
private static final int ITERATIONS = 50; // 重複 50 次取平均
// 三種算法
// 1. JDK 原生
int indexString = text.indexOf(pattern);
// 2. 暴力匹配 BF (Brute Force)
int indexBF = bfIndexOf(text, pattern);
// 3. KMP 算法
int indexKMP = kmpIndexOf(text.toCharArray(), pattern.toCharArray());
| 算法 | 總耗時 (ms) | 單次平均 (μs) | 相對性能 |
|---|---|---|---|
| String.indexOf() | 335 | 6.7 | 1.00x (基準) |
| KMP | 450 | 9.0 | 0.74x |
| BF (暴力匹配) | 550 | 11.0 | 0.61x |
String.indexOf() 內部使用 indexOfSupplementary() / indexOfLatin1(),針對 Latin1/UTF-16 編碼專門優化// next 數組構建 (失敗函數)
public static int[] buildNext(char[] pattern) {
int[] next = new int[pattern.length];
next[0] = -1;
int i = 0, j = -1;
while (i < pattern.length - 1) {
if (j == -1 || pattern[i] == pattern[j]) {
i++; j++;
next[i] = (pattern[i] != pattern[j]) ? j : next[j];
} else {
j = next[j];
}
}
return next;
}
// KMP 匹配
public static int kmpSearch(char[] text, char[] pattern) {
int[] next = buildNext(pattern);
int i = 0, j = 0;
while (i < text.length && j < pattern.length) {
if (j == -1 || text[i] == pattern[j]) {
i++; j++;
} else {
j = next[j];
}
}
return (j == pattern.length) ? i - j : -1;
}
public static int bfSearch(String text, String pattern) {
int n = text.length(), m = pattern.length();
for (int i = 0; i <= n - m; i++) {
int j = 0;
while (j < m && text.charAt(i + j) == pattern.charAt(j)) j++;
if (j == m) return i;
}
return -1;
}
| 場景 | 推薦方案 |
|---|---|
| 通用業務查找 | String.indexOf() / contains() |
| 超長文本/流式處理 | KMP / Boyer-Moore / Sunday 算法 |
| 多模式同時匹配 | AC 自動機 (Aho-Corasick) |
| 正則表達式 | Pattern.compile() + Matcher.find() |
| 極致性能 | 原生 C/JNI 實現、SIMD 指令集 (Intel Hyperscan) |
-Xms4g -Xmx4g 固定堆,或使用 JMH 基準測試框架new Random(42) 保證數據可復現結論:日常開發直接用 String.indexOf(),它是經過三十年優化的工業級實現。手寫 KMP/BF 僅用於面試、教學或極特殊場景(如流式匹配、嵌入式無標準庫環境)。