解析java語言中String方法之indexOf
今天來解析一下String方法中的indexOf這個方法
比如:
String str="你好中國";
System.out.println(str.indexOf("中國"));
返回來的結果為2;
問題來了,這個String類indexOf這個方法是怎麼實現的呢?
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++) {
/* Look for first character. */
//先找到第一個字元
if (source[i] != first) {
while (++i <= max && source[i] != first);
}
/* Found first character, now look at the rest of v2 */
if (i <= max) {
int j = i + 1;// 源陣列索引開始處(從找到的後一個字元開始)
int end = j + targetCount - 1;// 迴圈跳出條件
int k = targetOffset + 1;// 目標陣列索引開始處(因為已經找到一個字元)
// s:你好中國人
// t:中國
// 那麼 j = 2;s陣列整個長度是5; end = 3+2-1 = 4
// 也就是說:3 < 4; 也就是隻能迴圈一次,能把剩下的 國 遍歷完成。
// 原理是:兩個陣列都要同時匹配下一個索引所在處的值
// 所以需要兩個變數來遞增索引
// 需要注意的是:j和k的起始索引不同,end既能控制迴圈的次數(剛好是剩下未完成的字元次數)
// 又能讓源陣列的索引獲取到正確的值
for (; j < end && source[j]
== target[k]; j++, k++);
if (j == end) {
/* Found whole string. */
return i - sourceOffset;
}
}
}
return -1;
}
原理:
- 先找第一個字元,如果找到了再找後面的字元。
- 也就是 j 和 k 只要匹配就都+1,往後匹配下一對。
- 最難的就是 end,迴圈多少次了。j和k的起始索引不同,end既能控制迴圈的次數(剛好是剩下未完成的字元次數),又能讓源陣列的索引獲取到正確的值
相關文章
- 解析C語言中的sizeofC語言
- Go 語言中的方法Go
- java——indexof() (轉)JavaIndex
- 關於String內的indexOf方法的一些疑問Index
- 解析C語言中的sizeof (轉)C語言
- C語言中Pointer, Array,String and Structures的區別C語言Struct
- Java原始碼之String的HashCode方法Java原始碼
- Go 語言中 strings 包常用方法Go
- java String 常用方法集合Java
- Java -- String的intern方法Java
- Java雜記17—String全面解析Java
- Java語言中字元的處理 (轉)Java字元
- 淺析Java語言中的內部類Java
- dart系列之:dart語言中的異常Dart
- dart系列之:dart語言中的變數Dart變數
- dart系列之:dart語言中的函式Dart函式
- Java String類的replaceAll方法Java
- java String的equals,intern方法Java
- 深度解析 Go 語言中「切片」的三種特殊狀態Go
- indexOfIndex
- indexOf原理,Java,javascript,python實現IndexJavaScriptPython
- ES6 -- String 擴充套件方法解析套件
- C語言中指標, 陣列和字串(Pointer, Array and String in C Programming Language)C語言指標陣列字串
- java基礎(五) String性質深入解析Java
- Java中String類的常用方法Java
- Java 中 String 的構造方法Java構造方法
- Java 中 String 的常用方法(一)Java
- Java 中 String 的常用方法(二)Java
- Java--String類查詢方法Java
- 在Go語言中,怎樣使用Json的方法?GoJSON
- c語言中計算陣列長度的方法C語言陣列
- go語言中遍歷陣列的方法有哪些Go陣列
- C 語言中 define 的全部使用方法總結
- C語言中sync()C語言
- C語言中有C語言
- JDK原始碼解析系列之String 之一JDK原始碼
- c#之String.Split 方法C#
- JavaScript 陣列中的 indexOf 方法詳解JavaScript陣列Index