StringBuffer和StringBuilder之间的主要区别是什么?在决定其中任何一项时是否存在性能问题?
当前回答
StringBuffer是线程安全的,但StringBuilder不是线程安全的。StringBuilder比StringBuffer更快。StringBuffer已同步,而StringBuilder未同步同步。
其他回答
但需要借助一个例子来明确区别吗?StringBuffer或StringBuilder
只需使用StringBuilder,除非您确实试图在线程之间共享缓冲区。StringBuilder是原始同步StringBuffer类的非同步(开销更少=效率更高)弟弟。
StringBuffer排名第一。Sun关注所有条件下的正确性,因此他们使其同步,以使其线程安全,以防万一。
StringBuilder后来出现了。StringBuffer的大多数使用都是单线程的,不必要地支付了同步的成本。
由于StringBuilder是没有同步的StringBuffer的替代品,因此任何示例之间都不会有差异。
如果您试图在线程之间共享,可以使用StringBuffer,但要考虑是否需要更高级别的同步,例如,如果您同步使用StringBuilder的方法,可能不需要使用StringBuffer。
其他人正确地指出了两者之间的关键区别。然而,在性能方面,我想补充一点,JVM级别的优化“锁定Elision”可以使同步上下文中的性能差异几乎不存在。关于这一点的精彩阅读在这里和这里
String是一个不可变的对象,这意味着值不能更改,而StringBuffer是可变的。
StringBuffer是同步的,因此是线程安全的,而StringBuilder不是,并且只适用于单线程实例。
StringBuilder是在Java1.5中引入的,因此它不能与早期的JVM一起使用。
从Javadocs:
StringBuilder类提供了与StringBuffer兼容的API,但不能保证同步。该类被设计为在单个线程使用字符串缓冲区的地方(通常情况下)作为StringBuffer的替代品。在可能的情况下,建议优先使用该类而不是StringBuffer,因为在大多数实现中,它会更快。
StringBuffer中的每个方法都是同步的。因此,一次只允许一个线程操作StringBuffer对象。它增加了线程的等待时间并造成性能问题为了解决这个问题,SUN People推出了1.5版本的StringBuilder。
推荐文章
- Java 8接口方法中不允许“同步”的原因是什么?
- 如何找到Java堆大小和内存使用(Linux)?
- 使用Enum实现单例(Java)
- RabbitMQ与通道和连接之间的关系
- buildSessionFactory()配置方法在Hibernate中已弃用?
- Spring MVC -如何获得所有的请求参数在一个地图在Spring控制器?
- 如何在Java中按两个字段排序?
- 文件之间的差异。路径中的分隔符和斜杠
- 在方法参数中使用NotNull注释
- Spring MVC中处理可选参数的@RequestParam
- Tomcat:如何查找正在运行的Tomcat版本?
- “java”、“javaw”和“javaws”之间有什么区别?
- 将Date对象转换为日历对象
- 在Java中保存最后N个元素的大小有限的队列
- 如何运行一个类从Jar不是主类在其清单文件