【Java基础专题】10. StringBuilder、StringBuffer有什么区别?
本问题对应的项目链接:高频题回答模版训练
回答指导:可以看看他们的区别,主要看 append 这个方法,可以简单看下源码,其实看源码不难,简单看下定义+一两个核心方法就可以了,说明你看过源码,给人感觉不一样。
本问题对应的项目链接:高频题回答模版训练
回答指导:可以看看他们的区别,主要看 append 这个方法,可以简单看下源码,其实看源码不难,简单看下定义+一两个核心方法就可以了,说明你看过源码,给人感觉不一样。
共以下 11 个回答
首先来说他们都是可变的字符串对象,支持动态扩容。他们也都支持append或者insert这种方法。几乎是一模一样的,唯一的区别就在于是否现场安全。stringbuilder他没有做任何并发的控制,所以他在多线程下是不安全的。Stream buffer他的append的这个方法加了synchronized这个关键字,在同一时间只能有一个线程能够执行这个的方法。所以说他是线程安全的。
当然因为buffer他做了并发控制,所以说它的性能要略低于String builder,但是如果说我们的代码,不确定他以后会不会在高并发的场景下被执行,保险起见下还是使用stringbuffer更稳妥一些。
已完成
StringBuilder和StringBuffer都是Java提供用来操作可变字符串的对象,都是继承抽象类AbstractStringBuilder类来复用成员变量char[]数组、count变量记录字符个数和append()方法、toString()方法等等。主要区别是StringBuffer的方法都是使用synchronzied关键字修饰,表明在同一个时刻只能有一个线程操作同一个StringBuffer对象,所以StringBuffer是线程安全的,使用场景为多线程操作可变字符串,而StringBuilder是线程不安全的,使用于单线程操作可变字符串。
StringBuffer是线程安全的,适用于多线程环境下操作;
StringBuilder是线程不安全的,效率高,适用于单线程环境
StringBuilder、StringBuffer都是用来操作可变字符串的,都继承了StringBuilder、StringBuffer这个类。
StringBuilder是线程不安全的、StringBuffer是线程安全的,主要是在重写父类的方法时StringBuffer使用了synchronized关键字实现同步操作,StringBuffer的线程安全是有局限性的,只有对同一个对象进行字符串拼接是线程安全的,因为它加的是一个对象锁。StringBuffer在进行字符串拼接时先清除了缓存再拼接,StringBuilder是直接进行拼接。
StringBuilder是线程不安全的,append()不加锁,StringBuffer是线程安全的,所有方法都使用了synchronize方法,在append()前会清除缓存,再进行拼接。
这两个类都是用来操作字符串的,都继承了AbstractStringBuilder这个类。StringBuffer的每个方法都加了synchronized,可以保证线程安全,所以多线程下效率比StringBuilder低。对于最常用的append方法,Stringbuffer会先清缓存,再拼接,而StringBuilder是直接原本缓存的基础上进行拼接。另外,即使StringBuffer的每个方法都加了synchronized,它只能保证同一个StringBuffer对象,拼接字符串是线程安全的,如果是一个stringBuilder对象拼接其它的stringBuilder或者stringBuffer,就不能保证线程安全。例如:两个stringBuffer对象s1 s2,有一个线程执行s1.append(s2),那么s1会被锁住,但是其它线程仍然可以修改s2,此时就可能导致安全问题。
他们都是可变的对象,区别在于StringBuilder 没有加锁不是线程安全的,而 StringBuffer 大多数方法都加了 synchronized,是线程安全的,但执行效率会低点。StringBuffer还会有一个toStringCache保存上次toString的字符串,一旦对象修改就将toStringCache置为null,主要用来加快 toString 的执行效率。
StringBuilder 和 StringBuffer 都是可变类,任何对它们的操作都不会产生新的对象。两者的区别在于:StringBuilder 没有加锁不是线程安全的,而 StringBuffer 大多数方法都加了 synchronized,是线程安全的,但执行效率会低点。源码中有一个细节,就是 StringBuffer 的 append 方法在执行真正的字符串拼接逻辑之前,会先清除 toStringCache,它是用来缓存最后一次 toString 结果的地方,主要用来加快 toString 的执行效率。
stringbuilder和stringbuffer都是abstractstringbuilder的子类,但是stringbuffer中的方法都是被synchronized关键字修饰的,也就代表着stringbuffer是线程安全的,但也意味着会影响运行效率,所以在线程安全的环境下使用stringbuilder否则使用stringbuffer。以append方法举例,这两个类的append方法基本一致都是调用父类的append方法但是stringbuffer因为维护了一个toStringcache所以在对字符串修改时会先清空缓存。还有一点需要补充,就是虽然stringbuffer的方法被synchronized修饰,但是锁住的只是当前的stringbuffer对象,如果拼接的是string对象那无可厚非,但是如果拼接的是另外一个stringbuffer或stringbuilder,我们无法保证它们是线程安全的。
两个都是可变字符串,StringBuilder是线程不安全的,但是速度快,stringbuffer是安全的,同样速度相对慢一点,都不能被继承,被final修饰,都实现了serialzable接口,也能串行化在网络中传输,内容都存在父类的abstractstringbuilder的char【】vale中。