String.java中contains方法
讲真,本人很好奇,为什么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方法相关推荐
- java中main方法前的public static void及其后面的(String[] args)【笔记自用】
为什么Java的main方法必须是public static void? 一. void 如下,像C, C++一样,将返回值类型改为int,再返回一个0,虽然编译通过,但是运行时会报错. 找到一种可理 ...
- 使用java中replaceAll方法替换字符串中的反斜杠
今天在项目中使用java中replaceAll方法将字符串中的反斜杠("\")替换成空字符串(""),结果出现如下的异常: 1 java.util.regex. ...
- java中collection方法_Java 8中的Collector toCollection()方法
toCollection()Java中的Collector类的方法返回一个Collector,该Collector以遇到的顺序将输入元素累积到一个新的Collection中. 语法如下static & ...
- java 返回值判断_在Java中判断方法重载的条件除了参数外,还可以通过返回值类型判断。_学小易找答案...
[单选题]若int x;且有下面的程序片断,则输出结果是() . for (x=3; x<6; x++) { printf((x%2) ? "##%d" : "** ...
- java中同步_在Java中的方法同步和语句同步(块同步) - Break易站
Java 多线程 线程主要通过共享对字段的访问和参考字段引用的对象进行通信.这种通信形式非常有效,但可能出现两种错误:线程干扰和内存一致性错误.需要一些同步构造来防止这些错误.以下示例显示了我们需要同 ...
- JAVA中的方法和构造方法有什么区别
JAVA中的方法和构造方法有什么区别 1.方法有返回类型,方法名小写,不能和类名相同:构造方法没有返回类型,void也不行,名与类名相同. 2.构造方法是初始化对象的重要途径,所以就算你给一个类没有定 ...
- Java中的方法(形参及实参)return返回类型
如何定义 Java 中的方法 所谓方法,就是用来解决一类问题的代码的有序组合,是一个功能模块. 一般情况下,定义一个方法的语法是: 其中: 1. 访问修饰符:方法允许被访问的权限范围, 可以是 pub ...
- 安卓开发——JNI——回调java中的方法
JNI开发中 在C代码中回调java中的方法 package com.example.jnitest2;import android.app.Activity; import android.cont ...
- Java中equals()方法和==的区别分析
Java中equals方法和==的区别分析 equals(Object obj)方法,将对象与传入的obj进行比较,相等返回true,否则返回false.equals方法和"==" ...
最新文章
- 怎么卸载云骑士装机大师
- Linux网络通信管理
- 19、计算机图形学——蒙特卡洛路径追踪
- python中def fun(a、b=200)_python 基础 函数
- clear在CSS中的妙用
- cam350怎么看顶层_蛋糕胚速学教程大全,适合初学者看哦!
- 你好a+b(非入门)
- 大牛深入讲解!9次Java面试经验总结
- 安全登录代码 php,PHP登录怎么写安全
- ID的权限问题导致免密码登录失效
- href=“javascript:void(0);”和href=void(change_code(this));
- IDM无法连接到目标服务器
- 拉斯韦加斯夜景走马观花
- SOLIDWORKS之VBA宏(三)
- AURIX TC397 Flash编程
- dvanced Installer Architect
- Flowable 快速入门教程:通过 Comment 保存审核信息
- NOIP 2005 篝火晚会
- spring AOP中 aop:advisor 与 aop:aspect 的区别
- 未越狱iphone与 Android短信备份迁移攻略