String / String buffer / String builder 原理
String 内部结构
public final class String {
private final char value[];
private int hash; // Default to 0
}
String buffer 与String builder 都继承了AbstractStringBuilder 内部方法基本都是一样的但是。String
多线程
- String buffer 是线程安全的 好多方法都添加的synchronized。
@Override
public synchronized StringBuffer append(String str) {
toStringCache = null;
super.append(str);
return this;
}
- Stringbuilder 是线程不安全的
@Override
public StringBuilder append(String str) {
super.append(str);
return this;
}
String 长度是不可变的
- String 在进行subString replace 操作的时候都会。new 一个String
- String 在进行 + 操作的时候jvm 会 通过new StringBuilder 来进行操作
存储
String s1 = new String("123");
先去看String常量池里面有没有"123" 有的话直接 在堆内存中new Stirng(“1234”)
否则 现在常量池里面增加 “123” 然后再在堆内存中new Stirng(“1234”)
String a = new String(“1234”);// 先判断string pool 里面有没有,没有的话先添加到string pool中,由于有new 操作所以会在堆内存中再存一份。创建2个对象/如果string pool 中存在则只需进行后面的步骤。 创建1个对象。
String b = a.intern(); // 指向String pool 里面的对象 “1234”。 创建0个对象
String c = "1234"; // 直接指向 string pool 里面的 “1234”。 创建0个对象
System.out.println(a == b); // false
System.out.println(c == b); // true