1.String
1.String类结构
String结构图
2.String类是被final修饰的是不可被继承的
3.String类本质是被final修饰的字符数组所以内容是不可变的
String类型的对象是不可变的对象, 因此每次对 String 类型对象改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,这样效率低下,而且浪费大量的内存空间,所以经常改变内容的字符串最好不要用 String 。而是使用StringBuffer和StringBuilder。
我们可以看到,初始String值为“hello”。
然后在这个字符串后面加上新的字符串“world”,这个过程是需要重新在栈堆内存中开辟内存空间的。
最终得到了“hello world”字符串也相应的需要开辟内存空间。
因此我们使用StringBuffer类和StringBuild类来对此种变化字符串进行处理。
4.方法内改变String类型的对象(形参)的应用地址,方法外的实参引用地址不被改变
public class Demo10 {
public static String addStr(String string){
string = string + ",你变了";
return string;
}
public static void main(String[] args) {
String string = new String();
string = "啊,是小非肥啊";
String addStr = addStr(string);
//函数返回值
System.out.println("addStr: "+addStr);
//主函数的string
System.out.println("string: "+string);
}
}
结果:
基本数据类型是不变的。引用对象是会改变的,但是包装类和String例外。
2.StringBuffer
1.StringBuffer类结构
父类
字符数组没有被final修饰所以是可以被改变的。
StringBuffer结构图
1.StringBuffer类被final修饰,是不可被继承的
2.StringBuffer本质是字符数组,不被final修饰所以是可以被更改的
3.线程安全的,因为StringBuffer的方法都是被Synchronized修饰的
3.StringBuffer缓冲区
3.StringBuilder
1.StringBuilder类结构
父类:
结构图
StringBuffer和StringBuilder的类结构图相同
父类
字符数组没有被final修饰所以是可以被改变的。
2.StringBuilder类被final修饰,是不可被继承的。
3.线程不安全的
3.StringBuilder缓冲区
5.StringBuffer和StringBuilder的区别
- StringBuffer线程安全(方法被synchronized),StringBuilder线程不安全。
- StringBuffer速度慢,适合多线程。StringBuilder速度快,适合单线程。
- StringBuffer和StringBuilder都继承了AbstractStringBuilder。
- StringBuffer和StringBuilder的类结构相同