【Java】疯狂Java基础(四)——String, StringBuffer,StringBuilder的区别
2023-05-10 17:17:11
java中String、StringBuffer、Stringbuilder是编程中经常使用的字符串,它们之间的区别也是面试中经常问的问题。现在总结一下,看看它们的区别。
1.可变和不可变
在String类中使用字符数组来保存字符串,如下所示final“修饰符,所以可以知道string对象是不可变的。private final char value[]; String 对于不可改变的对象,一旦创建,其值就无法修改. . 现有String对象的修改是重新创建新对象,然后保存新值.
Stringbuilder和Stringbuilder都是从Abstractstringbuilder继承的,在Abstractstringbuilder中也使用字符数组来保存字符串,如下所示,这两个对象都是可变的。
char[] value; StringBuffer:它是一个可变对象,当它被修改时,它不会像String那样重建对象 , 它只能通过构造函数建立, 如: StringBuffer sb = new StringBuffer();
不能通过赋值符号支付给他. , 如 sb = “welcome to here!”;//error 对象建立后,内存空间将在内存中分配,并初始保存nulll.赋值Stringbuffer时,可以使用其append方法. sb.append(“hello”);
2.多线程是否安全
String中的对象是不可变的,可以理解为常量, 显然,线程是安全的 。
Abstractstringbuilder是stringbuilder和stringbuffer的公共父亲,定义了一些字符串的基本操作,如expandcapacity、append、insert、indexof等公共方法。
Stringbuffer在调用方法中添加同步锁或同步锁,因此 线程安全的 。查看以下源码: public synchronized StringBuffer reverse() { super .reverse(); return this ; } public int indexOf(String str) { return indexOf(str, 0); //存在 public synchronized int indexOf(String str, int fromIndex) 方法 }
Stringbuilder没有添加同步锁的方法,所以是 非线程安全 。
3.Stringbuilder与Stringbuffer共同点
Stringbuilder和Stringbuffer公共父类Abstractstringbuilder( 抽象类 )。
抽象类和接口的区别之一是,一些子类的公共方法可以在抽象类中定义,子类只需要添加新的功能,而不需要重复现有的方法;接口只是方法的声明和常数的定义。
StringBuilder、Stringbuffer的方法将在Abstractstringbuilder中调用公共方法,如super.append(..)。只有StringBuffer会在方法上添加synchronized关键字进行同步。
最后,如果程序不是多线程的话,使用Stringbuilder比Stringbuffer更有效率。
String效率比String更高 < StringBuffer < StringBuilder,但是在String S1 =“This is only a”+“simple”+“testString效率最高。