1. indexOf(…)找到元素出現的位置。
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)
前兩個方法對參數處理後,都間接的調用了第三個方法,第四五個方法也間接調用了第六個方法,第三個是從頭開始周遊的,第六個是從尾周遊的,他們的原理是一樣的,現在詳細解釋下第三個方法:
static int indexOf(char[]source, int sourceOffset, int sourceCount,
char[] target, int targetOffset, inttargetCount,
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;//依次比對的話,源串的最後一個下标
//k是目标字元串的下标
for (int k = targetOffset + 1;j < end && source[j]
== target[k]; j++,k++);
//j== end時,源串與目标串完全比對,傳回比對的下标
if (j == end) {
return i - sourceOffset;
}
}
}
//沒有找到就傳回-1
return -1;
}