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;
}
關於此方法的解釋 全都在註釋裏了