天天看點

StringBuffer和StringBuilder源碼解析(三)-- indexOf()方法1.    indexOf(…)找到元素出現的位置。

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;

    }