JDK源码架构解读

StringBuilder源码解读

2019-12-05  本文已影响0人  spring_coderman

源码是基于JDK1.7的

类图

StringBuilder.png

构造方法

追加操作

追加操作.jpg

追加实现

扩容操作

插入操作

字符拷贝.jpg

字符串查找

字符串查找.jpg
 /**
     * Code shared by String and StringBuffer to do searches. The
     * source is the character array being searched, and the target
     * is the string being searched for.
     *
     * @param   source       被搜索的原字符串
     * @param   sourceOffset 原字符串搜索的偏移量(就是从第几位索引位置开始搜索)这里传入的是0
     * @param   sourceCount  原字符串的字符数组长度
     * @param   target       搜索的目标字符串
     * @param   targetOffset 搜索的目标字符串的偏移量(就是从第几位索引位置开始搜索) 这里传入的是0
     * @param   targetCount  目标字符串的字符数组长度 
     * @param   fromIndex    指定从第几位索引位置开始搜索
     */
    static int lastIndexOf(char[] source, int sourceOffset, int sourceCount,
            char[] target, int targetOffset, int targetCount,
            int fromIndex) {
        /*
         * 
         * 首先检查参数,不进行空校验,因为假定入参不是空,如果没有则尽快返回。
         */
        //找到搜索的最后位置
        int rightIndex = sourceCount - targetCount;
        //索引位置为负,则直接返回找不到
        if (fromIndex < 0) {
            return -1;
        }
       //索引位置超过搜索的最后位置,则以最后位置为准
        if (fromIndex > rightIndex) {
            fromIndex = rightIndex;
        }
        //如果目标字符串的长度是0,则默认是匹配成功的,进行返回
        if (targetCount == 0) {
            return fromIndex;
        }
       //根据目标字符串的偏移量和目标字符串的大小找到最后匹配字符串的索引下标
        int strLastIndex = targetOffset + targetCount - 1;
       //找到需要匹配的第一个字符串
        char strLastChar = target[strLastIndex];
       //计算原字符串需要搜索的起始位置
        int min = sourceOffset + targetCount - 1;
       //计算原字符串需要搜索的结束位置
        int i = min + fromIndex;

       //根据下标循环匹配直到找到或者找不到
        startSearchForLastChar:
        while (true) {
            while (i >= min && source[i] != strLastChar) {
                i--;
            }
            if (i < min) {
                return -1;
            }
            int j = i - 1;
            int start = j - (targetCount - 1);
            int k = strLastIndex - 1;

            while (j > start) {
                if (source[j--] != target[k--]) {
                    i--;
                    continue startSearchForLastChar;
                }
            }
            //计算找到后的下标
            return start - sourceOffset + 1;
        }
    }

序列化与toString

字符可读.jpg
上一篇 下一篇

猜你喜欢

热点阅读