一、使用contains的一个demo
public class Test {
public static void main(String[] args) {
String a="hello";
String b="hell";
System.out.println(a.contains(b));
}
}
打印输出:true
二、源码分析
s代表目标的字符串,是否包含的的串
public boolean contains(CharSequence s) {
return indexOf(s.toString()) > -1;
}
从目标字符串的第0个位置开始比对
public int indexOf(String str) {
return indexOf(str, 0);
}
public int indexOf(String str, int fromIndex) {
return indexOf(value, 0, value.length,
str.value, 0, str.value.length, fromIndex);
}
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++) {
//找到第一个相等的字符串
if (source[i] != first) {
while (++i <= max && source[i] != first);
}
//找到第一字符相等后,判断剩下的十分相等
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) {
//找到了包含的串
return i - sourceOffset;
}
}
}
//没有找到相等的串
return -1;
}
三、总结步骤
1、做前置工作
如果目标串的长度为0,则任意字符串包含空串
2、找出在源串中可以移动的最大位置
3、根据在源串中可以移动的位置,找出第一个相等的串
4、判断源串的是否包含剩下的串
5、如果找到直接返回在源串的开始的位置
6、没有找到重复3、4、5
7、当没有符合的时候返回-1