A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始


String类源码分析 -- by maxwell

今天把String类的源码看了一遍,该类大概2000多行代码,注释就有1000多行。这个类主要都是对char[]的操作。
我大概注释了60%左右的方法,重要的方法做了分析注释,对这些方法也算有了比较深刻的认识。


//返回此字符串的哈希码。String 对象的哈希码根据以下公式计算:
//s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
//重写了Object的hashCode()方法。
//在java中有一条规定:若equals()被覆盖过,则hashCode()也必须被覆盖过。
public int hashCode() {
        int h = hash;
        if (h == 0 && value.length > 0) {
                char val[] = value;

                for (int i = 0; i < value.length; i++) {
                        h = 31 * h + val;
                }
                hash = h;
        }
        return h;
}

//返回在此字符串中第一次出现指定字符处的索引,从指定的索引开始搜索。
public int indexOf(int ch, int fromIndex) {
        final int max = value.length;
        if (fromIndex < 0) { //如果索引小于0
                fromIndex = 0;
        } else if (fromIndex >= max) { //如果索引大于字符串长度
                // Note: fromIndex might be near -1>>>1.
                return -1;
        }

        if (ch < Character.MIN_SUPPLEMENTARY_CODE_POINT) {
                // handle most cases here (ch is a BMP code point or a
                // negative value (invalid code point))
                final char[] value = this.value;
                for (int i = fromIndex; i < max; i++) { //索引位置开始到字符串结尾一致找是否有字符ch
                        if (value == ch) {
                                return i; //找到返回第一次出现的位置
                        }
                }
                return -1; //没找到返回-1
        } else {
                return indexOfSupplementary(ch, fromIndex);
        }
}

//返回指定字符在此字符串中最后一次出现处的索引,从指定的索引处开始进行反向搜索。
//这里循环控制变量i的取值值得学习!
public int lastIndexOf(int ch, int fromIndex) {
        if (ch < Character.MIN_SUPPLEMENTARY_CODE_POINT) {
                // handle most cases here (ch is a BMP code point or a
                // negative value (invalid code point))
                final char[] value = this.value; //原字符串
                int i = Math.min(fromIndex, value.length - 1); //这里考虑很充分,如果fromIndex大于value.length - 1,就从字符串最后一个字符开始找
                for (; i >= 0; i--) { //反向查找,所以是i--
                        if (value == ch) {
                                return i; //找到返回最后一次出现的索引
                        }
                }
                return -1; //没找到返回-1
        } else {
                return lastIndexOfSupplementary(ch, fromIndex);
        }
}
// 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.
// 这个方法不是public的,所以在API文档中是没有的。
/* 参数说明:
        source       the characters being searched.
        sourceOffset offset of the source string.
        sourceCount  count of the source string.
        target       the characters being searched for.
        targetOffset offset of the target string.
        targetCount  count of the target string.
        fromIndex    the index to begin searching from.
*/
static int indexOf(char[] source, int sourceOffset, int sourceCount,
                char[] target, int targetOffset, int targetCount,
                int fromIndex) {
        if (fromIndex >= sourceCount) {
                return (targetCount == 0 ? sourceCount : -1);
        }
        if (fromIndex < 0) {
                fromIndex = 0;
        }
        if (targetCount == 0) {
                return fromIndex;
        }

        char first = target[targetOffset];
        int max = sourceOffset + (sourceCount - targetCount);

        for (int i = sourceOffset + fromIndex; i <= max; i++) {
                /* Look for first character. */
                if (source != first) {
                        while (++i <= max && source != first);
                }

                /* Found first character, now look at the rest of v2 */
                if (i <= max) {
                        int j = i + 1;
                        int end = j + targetCount - 1;
                        for (int k = targetOffset + 1; j < end && source[j]
                                        == target[k]; j++, k++);

                        if (j == end) {
                                /* Found whole string. */
                                return i - sourceOffset;
                        }
                }
        }
        return -1;
}


// 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.
// 这个方法不是public的,所以在API文档中是没有的。
/* 参数说明:
        source       the characters being searched.
        sourceOffset offset of the source string.
        sourceCount  count of the source string.
        target       the characters being searched for.
        targetOffset offset of the target string.
        targetCount  count of the target string.
        fromIndex    the index to begin searching from.
*/
static int lastIndexOf(char[] source, int sourceOffset, int sourceCount,
                char[] target, int targetOffset, int targetCount,
                int fromIndex) {
        /*
         * Check arguments; return immediately where possible. For
         * consistency, don't check for null str.
         */
        int rightIndex = sourceCount - targetCount;
        if (fromIndex < 0) {
                return -1;
        }
        if (fromIndex > rightIndex) {
                fromIndex = rightIndex;
        }
        /* Empty string always matches. */
        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 != 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;
        }
}



0 个回复

您需要登录后才可以回帖 登录 | 加入黑马