Java中String、StringBuilder和StringBuffer源码分析及区别详解

String、StringBuilder和StringBuffer是我们在写代码的过程中经常使用到,之前只是使用,没有深入的了解这三个的底层原理以及区别,以下是自己在学习jdk源码过程对这三个理解。

一.String、StringBuilder和StringBuffer三者的区别

1.String字符串常量:在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串,String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,这样不仅效率低下,而且大量浪费有限的内存空间,列如:初始String值为“hello”,然后在这个字符串后面加上新的字符串“world”,这个过程是需要重新在栈堆内存中开辟内存空间的,最终得到了“hello world”字符串也相应的需要开辟内存空间,短短的两个字符串,却需要开辟三次内存空间。

2.StringBuffer、StringBuilder都属于字符串变量:都可以对字符串进行修改,不会产生新的未使用对象。和 String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。StringBuffer是线程安全的,被synchronized修饰符所修饰,速度慢,StringBuilder不是线程安全的,速度快,在日常能够使用中,如果没有要求线程安全,建议使用StringBuilder。

3.String、StringBuilder和StringBuffer执行速度由高到低:StringBuilder>StringBuffer>String

二.String、StringBuilder和StringBuffer三者的源码分析

1.String源码

//不含参数的构造函数,一般没什么用,因为value是不可变量
public String() {
    this.value = new char[0];
}
//参数为String类型
public String(String original) {
    this.value = original.value;
    this.hash = original.hash;
}
//参数为char数组,使用java.utils包中的Arrays类复制
public String(char value[]) {
    this.value = Arrays.copyOf(value, value.length);
}
//从bytes数组中的offset位置开始,将长度为length的字节,以charsetName格式编码,拷贝到value
public String(byte bytes[], int offset, int length, String charsetName)
        throws UnsupportedEncodingException {
    if (charsetName == null)
        throw new NullPointerException("charsetName");
    checkBounds(bytes, offset, length);
    this.value = StringCoding.decode(charsetName, bytes, offset, length);
}
//调用public String(byte bytes[], int offset, int length, String charsetName)构造函数
public String(byte bytes[], String charsetName)
        throws UnsupportedEncodingException {
    this(bytes, 0, bytes.length, charsetName);
}

这里需要注意的一点是,String不属于8种基本数据类型,String是一个对象。

因为对象的默认值是null,所以String的默认值也是null;

但它又是一种特殊的对象,有其它对象没有的一些特性。

比如构造方法new String()和new String(“”)都会返回一个空字符串而不是null。

2.StringBuffer源码

AbstractStringBuilder是StringBuilder和StringBuffer都继承的抽象类,StringBuilder和StringBuffer中操作字符串的方法大部分都在其中,是一个核心抽象类,大家可以深入了解以下
value是一个char类型数组,给StringBuffer赋一个初始容量

 

 StringBuffer被synchronized所修饰,是StringBuffer实现线程安全的,toStringCache作用:返回最后一次toString的缓存值,一旦StringBuffer被修改就清除这个缓存值。

StringBuffer是线程安全,被synchronized关键字修饰,性能与StringBuilder相比当然大打折扣,线程安全的应用场景是多线程,那么访问的数量级肯定多,所以弄个缓存,可以平衡StringBuffer的性能

 

 3.StringBuilder源码

stringBuilder和stringBuffer很相似,1.只是stringBuffer所有的方法都加上了synchronized进行修饰,保证stringBuffer是线程安全的,2.toStringCache:加入缓存,提高stringBuffer的效率

暂时就介绍到,能力有限,深度不够,以后再进行改进

原文地址:https://www.cnblogs.com/wyrlzy/p/13832287.html