一起读读JAVA源码-String,StringBuilder,

2018-07-19  本文已影响14人  yuzl

总是听大神说String是不可变量,StringBuilder是线程不安全,StringBuffer是线程安全,嘚吧嘚一大堆记不住了。。。那有想过为什么吗?今天来读读源码解析一下。

StringBuilder

//定义一个StringBuilder对象
StringBuilder strBuilder=new StringBuilder("a");
//用两个最常用的方法
strBuilder.append("b").toString();

解析,定义StringBuilder对象时,进入源码时间

public StringBuilder(String str) {
    //调用父类嘛 稍后给出关系图
    super(str.length() + 16);
    append(str);
}

//父类构造函数在这
AbstractStringBuilder(int capacity) {
        value = new char[capacity];
}
//value声明在这
char[] value;

由源码可以看出,==定义一个StringBuilder对象即定义了一个char数组==

解析append()方法,进入源码时间

public StringBuilder append(String str) {
    //又是调用父类方法
    super.append(str);
    return this;
}

public AbstractStringBuilder append(String str) {
        if (str == null) str = "null";
        int len = str.length();
        //数组扩容,扩长度*2+2
        ensureCapacityInternal(count + len);
        //字符复制到数组中
        //该方法的作用是将当前字符串从start到end-1位置上的字符复制到字符数组c中,并从c的offset处开始存放
        str.getChars(0, len, value, count);
        //count为数组实际长度
        count += len;
        return this;
    }

最后一个toString方法,综上很明显,StringBuilder.toString()就是将数组转成String,我们看看源码

public String toString() {
    return new String(value, 0, count);
}

的确是将数组转成String输出就好了,但是这个String构造方法没看懂啊。。。
接下来我们看看String,对了,StringBuffer没看呢。来,我们先看一下StringBuffer
构造函数StringBuilder完全一致
关键append()方法

public synchronized StringBuffer append(String str) {
        super.append(str);
        return this;
}
public synchronized String toString() {
        return new String(value, 0, count);
}

对咯,关键就多了一个==synchronized==,所以实现线程同步。

String

此时涉及到一个常量池的概念
String.intern();将数据加入常量池

Integer int_1 = 40;
Integer int_2 = Integer.valueOf(40);
Integer int_3 = new Integer(40);
public static Integer valueOf(int i) {
        assert IntegerCache.high >= 127;
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }
private static class IntegerCache {
        static final int low = -128;
        static final int high;
        static final Integer cache[];

        static {
            // high value may be configured by property
            int h = 127;
            String integerCacheHighPropValue =
                sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
            if (integerCacheHighPropValue != null) {
                int i = parseInt(integerCacheHighPropValue);
                i = Math.max(i, 127);
                // Maximum array size is Integer.MAX_VALUE
                h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
            }
            high = h;

            cache = new Integer[(high - low) + 1];
            int j = low;
            for(int k = 0; k < cache.length; k++)
                cache[k] = new Integer(j++);
        }

        private IntegerCache() {}
    }
上一篇下一篇

猜你喜欢

热点阅读