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

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

在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 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。