String源码阅读之contains实现原理
【摘要】
String源码阅读之contains实现原理
contains
对String中的contains方法进行分析,了解其采用的是什么算法进行匹配。
//用于判断源字符串是否包含目标字符序列 CharSequence s public boolean contains(CharSequence s) { //调用in...
String源码阅读之contains实现原理
contains
对String中的contains方法进行分析,了解其采用的是什么算法进行匹配。
-
//用于判断源字符串是否包含目标字符序列 CharSequence s
-
public boolean contains(CharSequence s) {
-
//调用indexOf(String str)方法
-
return indexOf(s.toString()) > -1;
-
}
indexOf (String str)
-
public int indexOf(String str) {
-
//继续往下调用indexOf(String str, int fromIndex)方法,并传入匹配起始下标
-
return indexOf(str, 0);
-
}
indexOf (String str, int fromIndex)
-
public int indexOf(String str, int fromIndex) {
-
//继续往下调用indexOf(char[] source, int sourceOffset, int sourceCount,char[] target, int targetOffset, int targetCount,int fromIndex) 函数
-
//传入源字符串,源字符串偏移量,源字符串长度,目标字符串,目标字符串偏移量,目标字符串长度,匹配源字符串的起始坐标
-
return indexOf(value, 0, value.length,
-
str.value, 0, str.value.length, fromIndex);
-
}
indexOf (char[] source, int sourceOffset, int sourceCount,char[] target, int targetOffset, int targetCount,int fromIndex)
-
static int indexOf(char[] source, int sourceOffset, int sourceCount,
-
char[] target, int targetOffset, int targetCount,
-
int fromIndex) {
-
//若匹配的起始下标大于或等于源字符串的长度
-
if (fromIndex >= sourceCount) {
-
//检测目标长度是否为0,是则返回源字符串长度,否则返回-1
-
return (targetCount == 0 ? sourceCount : -1);
-
}
-
//若匹配的起始下标小于0
-
if (fromIndex < 0) {
-
//将匹配的起始下标置0
-
fromIndex = 0;
-
}
-
//若目标字符串长度等于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++);
-
//j能一直增加到end,说明已经成功匹配
-
if (j == end) {
-
/* Found whole string. */
-
//返回在源字符串中被匹配到的第一个字符的下标。
-
return i - sourceOffset;
-
}
-
}
-
}
-
//没有匹配到,返回-1
-
return -1;
-
}
文章转载自:https://blog.csdn.net/u012454429/article/details/82852034
文章来源: brucelong.blog.csdn.net,作者:Bruce小鬼,版权归原作者所有,如需转载,请联系作者。
原文链接:brucelong.blog.csdn.net/article/details/95589451
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)