jdk 源码阅读有感String

Posted junpb

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了jdk 源码阅读有感String相关的知识,希望对你有一定的参考价值。

闲暇之余阅读 jdk 源码。

 

(一)核心属性

    /** The value is used for character storage. */
    private final char value[];

    /** Cache the hash code for the string */
    private int hash; // Default to 0

String的核心结构,char型数组与 int 型 hash值。

 

(二)构造器

构造器方面,由于上述两个值是不可更改的,所以直接 对 String 构造,其实是没有用的,只不过是加上了一个引用。

    public String(String original) {
        this.value = original.value;
        this.hash = original.hash;
    }

对 char 类型数组使用构造方法时,则会借用调用相关的复制数组的操作,对String的底层抽象,字符数组进行赋值。

    public String(char value[]) {
        this.value = Arrays.copyOf(value, value.length);
    }

//
System.arraycopy(original, 0, copy, 0, len); //一个native方法,用于复制数组。

 

(三)方法内常用边界判断

if ((ooffset < 0) || (toffset < 0)
                || (toffset > (long)value.length - len)
                || (ooffset > (long)other.value.length - len)) {
            return false;
        }

连续的 ‘或’ 判断,采用逆向思维对边界判断。

 即判断当前字符串长度的长度减去开始位置后,与参数字符串的长度进行比较,判断边界条件。 

 

(四)Continue 或 break 的少用用法

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

设置好需要跳转的点,条件符合后进行跳转。

 

(五)代码性能提升————减少getField操作。

public String trim() {
        int len = value.length;
        int st = 0;
        char[] val = value;    /* avoid getfield opcode */

        while ((st < len) && (val[st] <= ‘ ‘)) {
            st++;
        }
        while ((st < len) && (val[len - 1] <= ‘ ‘)) {
            len--;
        }
        return ((st > 0) || (len < value.length)) ? substring(st, len) : this;
    }
}

value是String中的全局字符数组,在方法内部使用局部变量,得到字符数组的引用,可以有效地减少getField操作。从而提高代码运行效率。

参考:https://blog.csdn.net/gaopu12345/article/details/52084218

 

(六)intern()方法

A pool of strings, initially empty, is maintained privately by the class String.

When the intern method is invoked, if the pool already contains a string equal to this String object as determined by the equals(Object) method, then the string from the pool is returned.

Otherwise, this  String object is added to the pool and a reference to this code String object is returned.

intern方法用于减少String对象引用,实质上是减少String池中的引用数量。

 

以上是关于jdk 源码阅读有感String的主要内容,如果未能解决你的问题,请参考以下文章

阅读JDK源码后,我有了优化它的冲动!

JDK10源码阅读--String

1.3JDK源码阅读之String

jdk1.8源码阅读(第2篇)java.lang.String

如何进行 Java 代码阅读分析?

有感而发:程序员到底要不要阅读框架源码?