String 中的 indexOf(String str) 方法解读

1、通过看源码,发现最终调用的是下面这个方法

static int indexOf(char[] source, int sourceOffset, int sourceCount,
            char[] target, int targetOffset, int targetCount,
            int fromIndex)

2、接下来仔细说明下这个方法

	
	public static void main(String[] args) {
		String  a = "abcdsadea";
		String  b = "as";
		int indexOf = a.indexOf(b,4);	
	}
	/**
	 * 
	 * @param source 源字符串,如 "abcdef".indexOf("a")中的 a 
	 * @param sourceOffset 源字符串偏移量,就是从原字符串的什么地方开始
	 * @param sourceCount 源字符串的总长度
	 * @param target 目标字符串 
	 * @param targetOffset  目标字符串的偏移量,就是从目标字符串的什么地方开始
	 * @param targetCount  目标字符串的总长度
	 * @param fromIndex  从指定的索引开 
	 * @return 返回-1代表,没有找到
	 */
    static int indexOf(char[] source, int sourceOffset, int sourceCount,
            char[] target, int targetOffset, int targetCount,
            int fromIndex) {
    	//如果指定的索引,大于或等于源字符串的总长度
        if (fromIndex >= sourceCount) {
        	//如果目标字符串是空字符串(不是null哦),则返回源数组长度(这是因为所有字符串末尾都包含“”字符串)
            return (targetCount == 0 ? sourceCount : -1);
        }
        //如果指定的索引<0,则把索引设置为0
        if (fromIndex < 0) {
            fromIndex = 0;
        }
        //如果目标字符串长度=0,则返回指定索引值(“”空字符串不占位,所以不为空的字符串,任何位置都可以有空字符串)
        if (targetCount == 0) {
            return fromIndex;
        }
        //获取目标字符串的指定初始偏移量的字符;如“abcdef”[0] == 'a'
        char first = target[targetOffset];
        //max = 源字符串的初始偏移量+(源字符串长度-目标字符串长度)
        int max = sourceOffset + (sourceCount - targetCount);
        //循环,i=源字符串总长度+指定索引值 4, 9-1=8
        for (int i = sourceOffset + fromIndex; i <= max; i++) {
            /* Look for first character. */
        	//如果遍历出的字符不等于需要比较的字符
            if (source[i] != first) {
            	//循环,如果源数组里没有与指定索引值的字符有相等的,就返回 i = max+1;有相等的,就返回相等字符的下标
                while (++i <= max && source[i] != first);
            }

            /* Found first character, now look at the rest of v2 */
            //如果i<max 说明源字符串内包含得有目标字符串的指定首字符串
            if (i <= max) {
            	//定义j 为相等字符串的下一位下标
                int j = i + 1;
                /*定义end 为结束下标,结束下标就为第一个字符所在源字符串位置+(目标字符串长度-1)、
                  如 源字符串:sdeakioiad   目标字符串:ioi
                  第一个i已经找到位置了,为 5, 那么源数组的循环就从6开始,8结束
                  其实这里和下面的循环才是重点
                 * */
                int end = j + targetCount - 1;
                /*循环,如果是目标字符串为单个的字符,就不会经过下面的循环了,相当于就找了目标第一次出现的位置。
                	这样想,如果目标是两个字符,找到了第一个字符的位置,那么源字符串中,紧接着此字符的下一个字符,
                	也需要判断是否与目标下一个字符是否相等。如果目标字符串很长,以此类推
                	如:   源字符串:dfdasdasd  目标字符串:ab
                	我们找到a第一次出现在3位置,那边我们接下来就要比较4位置是不是b。
                	
                	如果下一位不相等,循环结束
                */
                for (int k = targetOffset + 1; j < end && source[j]
                        == target[k]; j++, k++);
                //循环结束,如果j=end 说明在源字符串中找到了第一个目标字符串的位置
                if (j == end) {
                    /* Found whole string. */
                	//位置就为 i-源数组偏移量
                    return i - sourceOffset;
                }
            }
        }
        return -1;
    }

 

关于此方法的解释 全都在注释里了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值