int indexOf(Stringstr)
int indexOf(Stringstr, int fromIndex)
static intindexOf(char[] source, int sourceOffset, int sourceCount, char[] target,
int targetOffset, int targetCount, int fromIndex)
intlastIndexOf(String str)
intlastIndexOf(String str, int fromIndex)
static intlastIndexOf(char[] source, int sourceOffset, int sourceCount, char[] target,
int targetOffset, int targetCount, intfromIndex)
前两个方法对参数处理后,都间接的调用了第三个方法,第四五个方法也间接调用了第六个方法,第三个是从头开始遍历的,第六个是从尾遍历的,他们的原理是一样的,现在详细解释下第三个方法:
/*
参数:
Source:原字符串
sourceOffset:原字符串的偏移量
sourceCount:原字符串的长度
target:目标数组
targetOffset:目标字符串的偏移量
targetCount:目标字符串的长度。
fromIndex:开始检索的索引。
总体思路:
1. 检验参数,对不合法的参数进行处理。人家真个思维可真严谨啊。
2. 取出检索的索引对应的字符,先在字符串中对该字符进行搜索,找到了再依次比较目标字符串与源字符串的字符,找不到,继续找第一个字符。
*/
static int indexOf(char[]source, int sourceOffset, int sourceCount,
char[] target, int targetOffset, inttargetCount,
int fromIndex) {
/*开始检索的下标比目标串的长度要长时,如果目标字符串长度为0,直接返回目标数组的长度
否则就是找不到,返回-1
这明显是一个不符合条件的情况,但是还是考虑到了目标字符串的长度是否为0!真是高明!*/
if (fromIndex >= sourceCount) {
return (targetCount == 0 ? sourceCount : -1);
}
/*开始检索的下标比0还小,就从0开始检索*/
if (fromIndex < 0) {
fromIndex = 0;
}
/*目标串的长度为0,就返回开始索引的下标*/
if (targetCount == 0) {
return fromIndex;
}
/*取出目标字符串索引的字符*/
char first = target[targetOffset];
/*max是源串中的最后一个和目标字符串索引字符相同的下标,也就是源字符串中下标大于max的话,即使和目标字符串的索引匹配上了,也会因为要要比较的源字符串的长度小于要比较的目标字符串的长度小而不匹配!*/
int max = sourceOffset + (sourceCount -targetCount);
/*i = 起始偏移量+开始检测的索引。怎么解释这个呢?源字符串设置了的偏移量,必须要从这个偏移量开始计算,所以说开始检测的索引+源字符串的偏移量。
从i开始寻找,一直到max,如果没有找到就返回-1.找到了i,就检查其他字符的匹配情况。*/
for (int i = sourceOffset + fromIndex;i <= max; i++) {
/* 找到第一个字符出现的位置。
While循环从当前下标开始,查找与开始索引对应的值是否匹配,如果匹配,继续匹配其它的下标。如果其它下标完全匹配,那么返回i- sourceOffset
如果遇到不匹配的,回到for循环,从下一个i开始匹配….
*/
if (source[i] != first) {
while (++i <= max &&source[i] != first);
}
/* 查找到跟第一个字符匹配的字符,继续匹配下面的字符 */
if (i <= max) {
int j = i + 1;//源字符的下标
int end = j + targetCount - 1;//依次匹配的话,源串的最后一个下标
//k是目标字符串的下标
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;
}