Java 字符串中子串出现次数的统计方法
在 Java 中,统计一个字符串中子串出现的次数有几种常见方法,以下是几种实现方式:

使用 String.indexOf()
public static int countSubstring(String mainStr, String subStr) {
if (mainStr == null || subStr == null || mainStr.length() == 0 || subStr.length() == 0) {
return 0;
}
int count = 0;
int index = 0;
while ((index = mainStr.indexOf(subStr, index)) != -1) {
count++;
index += subStr.length();
}
return count;
}
使用正则表达式
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public static int countSubstringRegex(String mainStr, String subStr) {
if (mainStr == null || subStr == null || mainStr.length() == 0 || subStr.length() == 0) {
return 0;
}
Pattern pattern = Pattern.compile(Pattern.quote(subStr));
Matcher matcher = pattern.matcher(mainStr);
int count = 0;
while (matcher.find()) {
count++;
}
return count;
}
使用 Java 8 Stream API
import java.util.regex.Pattern;
public static int countSubstringStream(String mainStr, String subStr) {
if (mainStr == null || subStr == null || mainStr.length() == 0 || subStr.length() == 0) {
return 0;
}
return Pattern.compile(Pattern.quote(subStr))
.matcher(mainStr)
.results()
.mapToInt(m -> 1)
.sum();
}
递归方法(不推荐,仅作示例)
public static int countSubstringRecursive(String mainStr, String subStr) {
if (mainStr == null || subStr == null || mainStr.length() == 0 || subStr.length() == 0) {
return 0;
}
int index = mainStr.indexOf(subStr);
if (index == -1) {
return 0;
}
return 1 + countSubstringRecursive(mainStr.substring(index + subStr.length()), subStr);
}
注意事项
-
这些方法都是区分大小写的,如果需要不区分大小写,可以在查找前将字符串转换为小写:
mainStr = mainStr.toLowerCase(); subStr = subStr.toLowerCase();
-
如果子串为空字符串,上述方法可能会返回异常结果,因此需要添加空值检查。
-
对于重叠的子串(如 "aaa" 中 "aa" 出现了两次),方法一会统计重叠情况,而正则表达式方法默认不会统计重叠情况。
示例使用
public static void main(String[] args) {
String main = "ababababab";
String sub = "aba";
System.out.println(countSubstring(main, sub)); // 输出 3
System.out.println(countSubstringRegex(main, sub)); // 输出 3
System.out.println(countSubstringStream(main, sub)); // 输出 3
}
选择哪种方法取决于你的具体需求和性能考虑,对于大多数情况,方法一(使用 indexOf)是最简单直接的选择。

