1、通过看源码,发现最终调用的是下面这个方法

static int indexOf(char[] source, int sourceOffset, int sourceCount,
char[] target, int targetOffset, int targetCount,
int fromIndex)

2、接下来仔细说明下这个方法

public static void main(String[] args) {
String a = "abcdsadea";
String b = "as";
int indexOf = a.indexOf(b,4);
}
/**
*
* @param source 源字符串,如 "abcdef".indexOf("a")中的 a
* @param sourceOffset 源字符串偏移量,就是从原字符串的什么地方开始
* @param sourceCount 源字符串的总长度
* @param target 目标字符串
* @param targetOffset 目标字符串的偏移量,就是从目标字符串的什么地方开始
* @param targetCount 目标字符串的总长度
* @param fromIndex 从指定的索引开
* @return 返回-1代表,没有找到
*/
static int indexOf(char[] source, int sourceOffset, int sourceCount,
char[] target, int targetOffset, int targetCount,
int fromIndex) {
//如果指定的索引,大于或等于源字符串的总长度
if (fromIndex >= sourceCount) {
//如果目标字符串是空字符串(不是null哦),则返回源数组长度(这是因为所有字符串末尾都包含“”字符串)
return (targetCount == 0 ? sourceCount : -1);
}
//如果指定的索引<0,则把索引设置为0
if (fromIndex < 0) {
fromIndex = 0;
}
//如果目标字符串长度=0,则返回指定索引值(“”空字符串不占位,所以不为空的字符串,任何位置都可以有空字符串)
if (targetCount == 0) {
return fromIndex;
}
//获取目标字符串的指定初始偏移量的字符;如“abcdef”[0] == 'a'
char first = target[targetOffset];
//max = 源字符串的初始偏移量+(源字符串长度-目标字符串长度)
int max = sourceOffset + (sourceCount - targetCount);
//循环,i=源字符串总长度+指定索引值 4, 9-1=8
for (int i = sourceOffset + fromIndex; i <= max; i++) {
/* Look for first character. */
//如果遍历出的字符不等于需要比较的字符
if (source[i] != first) {
//循环,如果源数组里没有与指定索引值的字符有相等的,就返回 i = max+1;有相等的,就返回相等字符的下标
while (++i <= max && source[i] != first);
}

/* Found first character, now look at the rest of v2 */
//如果i<max 说明源字符串内包含得有目标字符串的指定首字符串
if (i <= max) {
//定义j 为相等字符串的下一位下标
int j = i + 1;
/*定义end 为结束下标,结束下标就为第一个字符所在源字符串位置+(目标字符串长度-1)、
如 源字符串:sdeakioiad 目标字符串:ioi
第一个i已经找到位置了,为 5, 那么源数组的循环就从6开始,8结束
其实这里和下面的循环才是重点
* */
int end = j + targetCount - 1;
/*循环,如果是目标字符串为单个的字符,就不会经过下面的循环了,相当于就找了目标第一次出现的位置。
这样想,如果目标是两个字符,找到了第一个字符的位置,那么源字符串中,紧接着此字符的下一个字符,
也需要判断是否与目标下一个字符是否相等。如果目标字符串很长,以此类推
如: 源字符串:dfdasdasd 目标字符串:ab
我们找到a第一次出现在3位置,那边我们接下来就要比较4位置是不是b。

如果下一位不相等,循环结束
*/
for (int k = targetOffset + 1; j < end && source[j]
== target[k]; j++, k++);
//循环结束,如果j=end 说明在源字符串中找到了第一个目标字符串的位置
if (j == end) {
/* Found whole string. */
//位置就为 i-源数组偏移量
return i - sourceOffset;
}
}
}
return -1;
}

 

关于此方法的解释 全都在注释里了