一.String类使用字符数组保存字符串,数组有final修饰,不可变.线程安全
String a="hello";String b=new String("hello");
第一种在栈内存定义了一个a对象的引用,指向堆内存的值"hello"的内存地址
第二种先在栈内存创建一个"hello"对象,new String又产生了另外一个对象.第一个对象无人引用
上图的解释:String在Java中使用了共享设计,在Java形成一个对象池,这个对象池可以保存多个对象,如果新实例化的对象已经在对象池中存在,就不在重复定义,直接从 对象池中取出使用。
二.StringBuilder类继承AbstractStringBuilder,底层也是字符数组保存字符串,可变.线程不安全
//无参构造,默认长度16的字符数组
public StringBuilder() {
super(16);
}
//带参数的构造函数
public StringBuilder(String str) {
super(str.length() + 16);
append(str);
}
//没有实现同步
public StringBuilder append(String str) {
super.append(str);
return this;
}
三.StringBuffer类继承AbstractStringBuffer,底层也是字符数组保存字符串,可变.线程安全
//无参构造,默认长度16的字符数组
public StringBuffer() {
super(16);
}
//带参数的构造函数
public StringBuffer(String str) {
super(str.length() + 16);
append(str);
}
//和StringBuilder的区别就是同步
public synchronized StringBuffer append(String str) {
super.append(str);
return this;
}
四.总结:
1.如果要操作少量的数据用 = String
2.单线程操作字符串缓冲区 下操作大量数据 = StringBuilder
3.多线程操作字符串缓冲区 下操作大量数据 = StringBuffer