讲真,本人很好奇,为什么kmp算法那么快,在String的contains方法中却没有使用这中算法。

为什么java String.contains 没有使用类似KMP字符串匹配算法进行优化?

这里有提到虽然kmp算法在时间复杂度上让人满意,但是面向公众的时候,kmp算法所带来的空间消耗是没有当前(2020年使用的jdk1.8)算法好的。

话不多说,带着求知的心探索一下目前contains使用的算法。

/*** Code shared by String and StringBuffer to do searches. The* source is the character array being searched, and the target* is the string being searched for.** @param   source       the characters being searched.* @param   sourceOffset offset of the source string.* @param   sourceCount  count of the source string.* @param   target       the characters being searched for.* @param   targetOffset offset of the target string.* @param   targetCount  count of the target string.* @param   fromIndex    the index to begin searching from.*/static int indexOf(char[] source, int sourceOffset, int sourceCount,char[] target, int targetOffset, int targetCount,int fromIndex) {if (fromIndex >= sourceCount) {return (targetCount == 0 ? sourceCount : -1);}if (fromIndex < 0) {fromIndex = 0;}if (targetCount == 0) {return fromIndex;}char first = target[targetOffset];int max = sourceOffset + (sourceCount - targetCount);for (int i = sourceOffset + fromIndex; i <= max; i++) {/* Look for first character. */if (source[i] != first) {while (++i <= max && source[i] != first);}/* Found first character, now look at the rest of v2 */if (i <= max) {int j = i + 1;int end = j + targetCount - 1;for (int k = targetOffset + 1; j < end && source[j]== target[k]; j++, k++);if (j == end) {/* Found whole string. */return i - sourceOffset;}}}return -1;}

这个算法的思想就是在主串中先找到匹配串中的第一个字符,然后再巧妙地用for循环匹配串中剩下的部分是否和主串后面的部分相同。总之,是个暴力。但是这个暴力感觉好厉害啊。

String.java中contains方法相关推荐

  1. java中main方法前的public static void及其后面的(String[] args)【笔记自用】

    为什么Java的main方法必须是public static void? 一. void 如下,像C, C++一样,将返回值类型改为int,再返回一个0,虽然编译通过,但是运行时会报错. 找到一种可理 ...

  2. 使用java中replaceAll方法替换字符串中的反斜杠

    今天在项目中使用java中replaceAll方法将字符串中的反斜杠("\")替换成空字符串(""),结果出现如下的异常: 1 java.util.regex. ...

  3. java中collection方法_Java 8中的Collector toCollection()方法

    toCollection()Java中的Collector类的方法返回一个Collector,该Collector以遇到的顺序将输入元素累积到一个新的Collection中. 语法如下static & ...

  4. java 返回值判断_在Java中判断方法重载的条件除了参数外,还可以通过返回值类型判断。_学小易找答案...

    [单选题]若int x;且有下面的程序片断,则输出结果是() . for (x=3; x<6; x++) { printf((x%2) ? "##%d" : "** ...

  5. java中同步_在Java中的方法同步和语句同步(块同步) - Break易站

    Java 多线程 线程主要通过共享对字段的访问和参考字段引用的对象进行通信.这种通信形式非常有效,但可能出现两种错误:线程干扰和内存一致性错误.需要一些同步构造来防止这些错误.以下示例显示了我们需要同 ...

  6. JAVA中的方法和构造方法有什么区别

    JAVA中的方法和构造方法有什么区别 1.方法有返回类型,方法名小写,不能和类名相同:构造方法没有返回类型,void也不行,名与类名相同. 2.构造方法是初始化对象的重要途径,所以就算你给一个类没有定 ...

  7. Java中的方法(形参及实参)return返回类型

    如何定义 Java 中的方法 所谓方法,就是用来解决一类问题的代码的有序组合,是一个功能模块. 一般情况下,定义一个方法的语法是: 其中: 1. 访问修饰符:方法允许被访问的权限范围, 可以是 pub ...

  8. 安卓开发——JNI——回调java中的方法

    JNI开发中 在C代码中回调java中的方法 package com.example.jnitest2;import android.app.Activity; import android.cont ...

  9. Java中equals()方法和==的区别分析

    Java中equals方法和==的区别分析 equals(Object obj)方法,将对象与传入的obj进行比较,相等返回true,否则返回false.equals方法和"==" ...

最新文章

  1. 怎么卸载云骑士装机大师
  2. Linux网络通信管理
  3. 19、计算机图形学——蒙特卡洛路径追踪
  4. python中def fun(a、b=200)_python 基础 函数
  5. clear在CSS中的妙用
  6. cam350怎么看顶层_蛋糕胚速学教程大全,适合初学者看哦!
  7. 你好a+b(非入门)
  8. 大牛深入讲解!9次Java面试经验总结
  9. 安全登录代码 php,PHP登录怎么写安全
  10. ID的权限问题导致免密码登录失效
  11. href=“javascript:void(0);”和href=void(change_code(this));
  12. IDM无法连接到目标服务器
  13. 拉斯韦加斯夜景走马观花
  14. SOLIDWORKS之VBA宏(三)
  15. AURIX TC397 Flash编程
  16. dvanced Installer Architect
  17. Flowable 快速入门教程:通过 Comment 保存审核信息
  18. NOIP 2005 篝火晚会
  19. spring AOP中 aop:advisor 与 aop:aspect 的区别
  20. 未越狱iphone与 Android短信备份迁移攻略

热门文章

  1. Linux5个基本命令行工具的替代品
  2. typora 公式对齐_快速上手丨Typora 中使用Markdown
  3. 错误 1067:进程意外终止的解决方案
  4. 【用Win7备份与还原让系统轻松回魂】
  5. 部署高效及泛化能力强的Osnet论文解读
  6. 关于文本数据预处理的一些方法
  7. amd cpu 安卓模拟器_Android模拟器稳定版终于支持AMD处理器 开发者喜极而泣
  8. 泛微OA_E9之明细表选择框,选项带出主表审批人
  9. 【公网远程Jellyfin】——本地部署Jellyfin影音服务器
  10. python图像转“抽象”画风