java String 源码分析<五> 常用方法分析lastIndexOf方法分析

lastIndexOf(int ch, int fromIndex)方法

lastIndexOf(int ch, int fromIndex)方法
lastIndexOf(int ch)方法

 /**
     * 
     * @param   ch   一个字符
     * @return   返回指定字符的最后一次出现的字符串中的索引
     */
    public int lastIndexOf(int ch) {
        return lastIndexOf(ch, value.length - 1);
    }
         /**
     * 
     * @param   ch   一个字符
     * @param   fromIndex 开始搜索的索引
     * @return   从fromIndex索引开始最后一次出现ch字符的索引
     */
    public int lastIndexOf(int ch, int fromIndex) {
        //一般ch都是从0到0xFFFF
        if (ch < Character.MIN_SUPPLEMENTARY_CODE_POINT) {
           
            final char[] value = this.value;
            //比较fromIndex和字符串最后一个字符的索引 
            //取较小值
            //防止fromIndex越界
            int i = Math.min(fromIndex, value.length - 1);
            //从最后一个索引位置开始向前查找
            for (; i >= 0; i--) {
                //逐一判断 相等即返回当前索引
                if (value[i] == ch) {
                
                    return i;
                }
            }
            //找不到即返回-1
            return -1;
        } else {
            //目前不做深究
            return lastIndexOfSupplementary(ch, fromIndex);
        }
    }

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

    / * @param   source       源字符串的数组.
     * @param   sourceOffset  源字符串的偏移量.
     * @param   sourceCount   源字符串的长度.
     * @param   target       子串的数组.
     * @param   targetOffset 子串偏移量.
     * @param   targetCount  子串的长度
     * @param   fromIndex    开始索引的位置
     * @return 返回指定子字符串最后一次出现的字符串中的索引。 
     */
 static int lastIndexOf(char[] source, int sourceOffset, int sourceCount,
            char[] target, int targetOffset, int targetCount,
            int fromIndex) {
    //因为sourceOffset和targetOffset 都为0 
    //查看源码调用此方法时的参数都为0
    //所以最右侧索引位为元字符长度-字串长度
        int rightIndex = sourceCount - targetCount;
        //开始索引位置小于0则说明找不到
        //因为这是从后面往前找的
        if (fromIndex < 0) {
            return -1;
        }
        //因为索引位置大于rightIndex肯定找不到
        //所以开始索引位置大于rightIndex就从rightIndex查找
        if (fromIndex > rightIndex) {
            fromIndex = rightIndex;
        }
        //子串长度为0,则返回源字符串最后一个字符位置的索引
        if (targetCount == 0) {
            return fromIndex;
        }
        //子串最后一个字符索引位
        int strLastIndex = targetOffset + targetCount - 1;
        //获取子串最后一个字符
        char strLastChar = target[strLastIndex];
        //因为子串和源字符串比较是从子串的最后一个位置向前比较
        //min为源字符串source最后一个字符的最小索引位置
        int min = sourceOffset + targetCount - 1;
        //因为有fromIndex ,所以源字符串source的最小索引为min+fromIndex
        int i = min + fromIndex;
        //此时i为源字符串source的最后一个位置最大索引位置
    startSearchForLastChar:
        while (true) {
            //循环找到最后一个字符相等的位置
            while (i >= min && source[i] != strLastChar) {
                i--;
            }
            //如果i<min说明找不到 返回-1
            if (i < min) {
                return -1;
            }
            //最后一个字符相等的索引找到后
            //获取源字符串source倒第二个字符索引位置 
            int j = i - 1;
            //首先明白是倒着比较的
            //start为计算源字符串source个字符索引位置的最后一个位置的前一个索引位置
            int start = j - (targetCount - 1);
            //k为字串倒第二个字符索引位置
            int k = strLastIndex - 1;

            while (j > start) {
            //依次向前比较所有字符
                if (source[j--] != target[k--]) {
                //如果不想等则向前继续查找倒数第一个字符相等的索引
                    i--;
                    continue startSearchForLastChar;
                }
            }
            //找到了返回
            //为什么+1
            //引文start为计算源字符串source个字符索引位置的最后一个位置的前一个索引位置
            return start - sourceOffset + 1;
        }
    }
文章转载参照:
http://www.516tool.com/java/29.html
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容