Java中统计指定子字符串出现次数的方法

Mia
Mia
发布时间:2026-10-14 | 2人浏览过
原创

在Java开发中,统计某个子字符串在一个长字符串中出现的频率是常见的需求。本文将解析如何利用 indexOf 方法结合循环逻辑,高效且准确地完成这一统计任务,并附带具体的代码实现与注意事项。

核心思路与算法逻辑

要实现字符串计数的功能,基本逻辑可以分为以下几个步骤:

  1. 定义计数器:初始化一个整型变量用于记录匹配到的次数。
  2. 定位首次出现:使用 indexOf 方法查找目标子串在当前搜索范围内的起始位置。
  3. 循环匹配与更新:只要找到的位置不是 -1(即未到达字符串末尾),就增加计数器,并将搜索的起始索引移动到当前匹配项之后,以便继续查找后续的重叠或独立匹配。
  4. 结束条件:当 indexOf 返回 -1 时,说明已无剩余子串可匹配,循环终止并返回总计数。

具体实现方案

第1步:基于索引累加的迭代方式

这是最推荐的方式,因为它避免了频繁创建新的字符串对象,性能更优。该方法通过维护当前的搜索起始索引 index 来实现。

  • 目的:在不修改原字符串的前提下,准确统计子串出现次数。
  • 入口:待检测的主字符串 str 和目标子串 key。
  • 动作:
    • 初始化 count = 0 和 index = 0。
    • 进入 while 循环,条件为 (index = str.indexOf(key, index)) != -1。
    • 每成功找到一次,索引后移 key.length() 位,避免重复计算同一位置的开始字符,同时计数器 count 加 1。
  • 完成状态:循环结束后返回 count。
public class StringCount {
    public static void main(String[] args) {
        String s = "javascriptjavasejavaeejavame";
        // 调用自定义方法统计 'java' 出现的次数
        int count = getSubString(s, "java");
        System.out.println(count);
    }

    /**
     * 统计key在str中出现的次数
     * @param str 主字符串
     * @param key 目标子串
     * @return 出现次数
     */
    public static int getSubString(String str, String key) {
        int count = 0;
        int index = 0;
        // indexOf(key, index) 从 index 位置开始查找 key
        while ((index = str.indexOf(key, index)) != -1) {
            index = index + key.length(); // 移动起始位置到当前匹配项之后
            count++;
        }
        return count;
    }
}

第2步:基于字符串截取的迭代方式(含纠错)

另一种直观的思路是每次找到子串后,将主串截断,只保留后半部分继续查找。但原文提供的代码存在拼写错误,实际使用时需修正方法名。

  • 目的:通过缩小搜索范围来减少循环内的比较量(注意:此法会创建新字符串对象,内存开销较大)。
  • 重要参数:需要确保使用正确的 Java 标准库方法名。
  • 纠错提醒:草稿中使用了 subtring,这在 Java 中是不存在的,正确的方法名为 substring。
  • 动作:
    • 初始化 count = 0 和 index = 0。
    • 当 str.indexOf(key, index) 不等于 -1 时,执行:
      1. 记录位置。
      2. 使用 str = str.substring(index + key.length()) 更新主串。
      3. count++。
public static int getSubCount_2(String str, String key) {
    int count = 0;
    int index = 0;
    
    // 注意:这里必须使用 substring,原文中的 subtring 是错误的
    while ((index = str.indexOf(key, index)) != -1) {
        str = str.substring(index + key.length()); // 修正拼写错误
        count++;
    }
    return count;
}

总结与最佳实践

虽然上述两种方法都能实现计数功能,但在实际工程中,**第一种基于索引累加的方法更为推荐**。它不需要重新分配内存来生成新的字符串对象,因此在处理大规模文本时能显著降低 GC(垃圾回收)压力并提升运行效率。此外,若仅需判断是否包含或进行简单正则匹配,也可以考虑使用 Pattern 和 Matcher,但对于单纯的子串频次统计,indexOf 循环是最轻量且高效的解决方案。

以上就是利用Java统计字符串出现次数的详细内容,更多关于Java字符串操作与性能优化的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表