java String,indexOf() 方法源码解析

首先,我自己想了一些方法,首先我要循环源[]并在其中找到目标[0]的位置。

然后将此位置的索引(假如此值为i)记录下来,之后开始找源[i + 1] == target [1]?然后一直比下去,如果不相等那么继续下一次循环,此次索引清零,若一直都是相等的,那么最后返回i;

粘贴下自己改装的简单代码:

/**
     * 写一个简单的替代String.indexof() 方法
     *
     * @param source
     * @param target
     * @return
     */
    static int indexOf(char[] source, char[] target) {
        // 准备数据
        int sourceCount = source.length;
        int targetCount = target.length;
        if (targetCount == 0) {
            return 0;
        }
        // first初始化为target[偏移量] 不指定为0 也就是target[0]
        char first = target[0];
        // 最大值为sourceCount - targetCount + soure偏移量 例如 若 [a,b,c] [a] 最大值为 2
        int max = (sourceCount - targetCount);
        // 循环source偏移量 + 开始匹配的位置  小于最小值
        for (int i = 0; i <= max; i++) {
            /* Look for first character. */
            // 判断如果 first 也就是 target[0]  判断是否能够匹配 如果不能那么 使i++ 但不大于max 并且 source[i] != first
            if (source[i] != first) {
                while (++i <= max && source[i] != first) ;
            }
            // 若第一个字符匹配成功 接下来的如何匹配
            // 第一个字符已经匹配成功那么 i其实是第一个字符的匹配位置 所以开始匹配第二个字符的匹配
            // 然后使用for循环判断是否接下来的字符是否匹配 如果不匹配 那么 j就不会一直循环到 end 结束位置
            // 如果j == end 则返回 i 的偏移量
            if (i <= max) {     // [a,b,v,c,d,w,r] [v,c]
                int j = i + 1;
                int end = j + targetCount - 1;  // end = 此索引位 + targetCount的长度
                for (int k = 1; j < end && source[j] == target[k]; j++, k++);
                if (j == end) {
                    /* Found whole string. */
                    return i;
                }
            }
        }
        return -1;
    }
}
经验分享 程序员 微信小程序 职场和发展