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;
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值