这三兄弟,可以说是面试没事就问…
这里我们看看JDK源码从而分析下。
1.String
//JDK源码:
public final class String
private final char value[];
咱们先看看String这个类,final修饰,不可重写,不可改变(常量),底层是char[],可以看做是char的包装类。
都不可变了,当然线程安全。
public class test {
public static void main(String[] args){
String a = "123";//创建String对象内容为"123",并赋给引用a
System.out.print(a);//打印a的引用值
System.out.println("内存地址:"+System.identityHashCode(a));
//这里相当于String a = new String("456");
//即又创建String对象内容为"456",并赋给引用a
a = "456";
System.out.print(a);//打印a的引用值
System.out.println("内存地址:"+System.identityHashCode(a));
}
}
内存图解:
输出结果
123地址值:366712642
456地址值:1829164700
可以看出a的值不一样但是内存地址不一样。
2.StringBuffer与StringBuilder
//StringBuffer,JDK源码:
public final class StringBuffer
extends AbstractStringBuilder
@Override
public synchronized int length() {
return count;
}
StringBuffer相当古老的类JDK1.0就有,内置方法都被synchronized修饰,其线程安全。
//StringBuilder,JDK源码:
public final class StringBuilder
extends AbstractStringBuilder
StringBuilder是JDK1.5才增加的,线程不安全。
StringBuffer是线程安全的,StringBuilder是线程不安全的
StringBuffer与StringBuilder都继承至AbstractStringBuilder。其内容可以更改。
3.结论
1.String,常量,速度最慢,线程安全
2.StringBuffer,变量,线程安全,适用于多线程下在字符缓冲区进行大量操作的情况。
3.StringBuilder,变量,线程不安全,适用于单线程下在字符缓冲区进行大量操作的情况。
4.在需要对字符串做操作的情况下,如果没有线程安全问题推荐用StringBuilder。