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;
    }

 

關於此方法的解釋 全都在註釋裏了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章