JAVA 中的 StringBuilder 和 StringBuffer 适用的场景是什么?

java,stringbuilder,stringbuffer · 浏览次数 : 16

小编点评

StringBuffer 和 StringBuilder 都是 Java 中用于处理字符串的工具,但它们适用于不同的场景。 StringBuffer 是线程安全的,而 StringBuilder 是非线程安全的。在大多数情况下,推荐使用 StringBuilder,因为它在性能方面更优,并且不需要处理线程安全问题。只有在确实需要线程安全的情况下,才需要使用 StringBuffer。 在以下情况下,推荐使用 StringBuffer: 多线程环境下的字符串操作 字符串连接操作涉及到大量数据的处理 StringBuffer 的线程安全性可以确保在多线程环境下字符串操作不会引发异常 然而,在以下情况下,推荐使用 StringBuilder: 单线程环境下的字符串操作 字符串连接操作不太涉及大量数据 StringBuilder 在性能方面更优,并且不需要处理线程安全问题 总之,StringBuffer 主要用于线程安全的环境,而 StringBuilder 更适用于性能要求较高的非线程安全环境。在实际开发中,可以根据具体需求选择合适的类。

正文

转自菜鸟教程的一位大哥-------未之奋豆
未之奋豆

429***663@qq.com

参考地址

6年前 (2018-05-07)

JAVA 中的 StringBuilder 和 StringBuffer 适用的场景是什么?

最简单的回答是,stringbuffer 基本没有适用场景,你应该在所有的情况下选择使用 stringbuiler,除非你真的遇到了一个需要线程安全的场景,如果遇到了,请务必在这里留言通知我。

然后,补充一点,关于线程安全,即使你真的遇到了这样的场景,很不幸的是,恐怕你仍然有 99.99....99% 的情况下没有必要选择 stringbuffer,因为 stringbuffer 的线程安全,仅仅是保证 jvm 不抛出异常顺利的往下执行而已,它可不保证逻辑正确和调用顺序正确。大多数时候,我们需要的不仅仅是线程安全,而是锁。

最后,为什么会有 stringbuffer 的存在,如果真的没有价值,为什么 jdk 会提供这个类?答案太简单了,因为最早是没有 stringbuilder 的,sun 的人不知处于何种愚蠢的考虑,决定让 stringbuffer 是线程安全的,然后大约 10 年之后,人们终于意识到这是一个多么愚蠢的决定,意识到在这 10 年之中这个愚蠢的决定为 java 运行速度慢这样的流言贡献了多大的力量,于是,在 jdk1.5 的时候,终于决定提供一个非线程安全的 stringbuffer 实现,并命名为 stringbuilder。顺便,javac 好像大概也是从这个版本开始,把所有用加号连接的 string 运算都隐式的改写成 stringbuilder,也就是说,从 jdk1.5 开始,用加号拼接字符串已经没有任何性能损失了。

如诸多评论所指出的,我上面说,"用加号拼接字符串已经没有任何性能损失了"并不严谨,严格的说,如果没有循环的情况下,单行用加号拼接字符串是没有性能损失的,java 编译器会隐式的替换成 stringbuilder,但在有循环的情况下,编译器没法做到足够智能的替换,仍然会有不必要的性能损耗,因此,用循环拼接字符串的时候,还是老老实实的用 stringbuilder 吧。

未之奋豆
未之奋豆

429***663@qq.com

参考地址

6年前 (2018-05-07)

与JAVA 中的 StringBuilder 和 StringBuffer 适用的场景是什么?相似的内容:

JAVA 中的 StringBuilder 和 StringBuffer 适用的场景是什么?

转自菜鸟教程的一位大哥 未之奋豆 未之奋豆 429***663@qq.com 参考地址 6年前 (2018-05-07) JAVA 中的 StringBuilder 和 StringBuffer 适用的场景是什么? 最简单的回答是,stringbuffer 基本没有适用场景,你应该在所有的情况下选择

Java 21的StringBuilder和StringBuffer新增了一个repeat方法

发现Java 21的StringBuilder和StringBuffer中多了repeat方法: /** * @throws IllegalArgumentException {@inheritDoc} * * @since 21 */ @Override public StringBuilder

Java 中的泛型 集合(List,Set) Map

泛型 集合(List,Set) Map 泛型 泛型的本质是参数化类型,即允许在编译时对集合进行类型检查,从而避免安全问题,提高代码的复用性 泛型的具体定义与作用 定义:泛型是一种在编译阶段进行类型检查的机制,它允许在类,方法,接口后通过<> 来声明类型参数.这些参数在编译时会被具体的类型替换.jav

Java 中的深拷贝和浅拷贝你了解吗?

Java 开发中,对象拷贝是常有的事,很多人可能搞不清到底是拷贝了引用还是拷贝了对象。本文将详细介绍相关知识,让你充分理解 Java 拷贝。

字节面试:说说Java中的锁机制?

Java 中的锁(Locking)机制主要是为了解决多线程环境下,对共享资源并发访问时的同步和互斥控制,以确保共享资源的安全访问。 锁的作用主要体现在以下几个方面: 互斥访问:确保在任何时刻,只有一个线程能够访问特定的资源或执行特定的代码段。这防止了多个线程同时修改同一资源导致的数据不一致问题。 内

Java中的读写锁ReentrantReadWriteLock详解,存在一个小缺陷

写在开头 最近是和java.util.concurrent.locks包下的同步类干上了,素有 并发根基 之称的concurrent包中全是精品,今天我们继续哈,今天学习的主题要由一个大厂常问的Java面试题开始: 小伙子,来说一说Java中的读写锁,你都用过哪些读写锁吧? 这个问题小伙伴们遇到了该

Java中Comparable与Comparator的区别

Java 中的 Comparable 和 Comparator 都是比较有用的集合排序接口,但是这俩接口使用却有着明显区别,具体使用哪一个接口,今天我们来一起了解下。 Comparable 接口 Comparable 是一个排序接口,位于 java.lang 包下面,实现该接口的类就可以进行自然排序

JNI编程之字符串处理

java中的字符串类型是String,对应的jni类型是jstring,由于jstring是引用类型,所以我们不能像基本数据类型那样去使用它,我们需要使用JNIEnv中的函数去处理jstring,下面介绍一些常用的字符串处理函数。 1.GetStringUTFChars() 作用:将jstring类

java中有哪些并发的List?只知道一种的就太逊了

java中有很多list,但是原生支持并发的并不多,我们在多线程的环境中如果想同时操作同一个list的时候,就涉及到了一个并发的过程,这时候我们就需要选择自带有并发属性的list,那么java中的并发list到底有哪些呢?今天要给大家介绍的是ArrayList、CopyOnWriteArrayLis

Java 集合中的排序算法浅析

排序是一个Java开发者,在日常开发过程中随处可见的开发内容,Java中有丰富的API可以调用使用。在Java语言中,作为集合工具类的排序方法,必定要做到通用、高效、实用这几点特征。主要探讨java中排序方法所使用的算法,以及那些是值得我们学习和借鉴的内容。文中如有理解和介绍的错误,一起学习,一起探讨,一起进步。