首页 > 编程语言 >JAVA 中的 StringBuilder 和 StringBuffer 适用的场景是什么?

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

时间:2024-07-05 19:31:57浏览次数:22  
标签:场景 JAVA stringbuilder stringbuffer StringBuffer 线程 加号 StringBuilder 未之奋豆

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

429***[email protected]

参考地址

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***[email protected]

参考地址

6年前 (2018-05-07)

标签:场景,JAVA,stringbuilder,stringbuffer,StringBuffer,线程,加号,StringBuilder,未之奋豆
From: https://www.cnblogs.com/by0429/p/18286483

相关文章

  • Java解析并修改JSON:将isShow属性改为false
    哈喽,大家好,我是木头左!在Java中,可以使用各种库来处理JSON数据。其中,Jackson和Gson是两个非常流行且功能强大的库。在这篇文章中,将使用Jackson库来解析给定的JSON字符串,将其转换为Map对象,然后修改其中的"isShow"属性,最后再将其转回JSON字符串。准备工作:添加Jackson依赖需要在项......
  • 博客摘录「 2024年 Java 面试八股文(20w字)」2024年7月2日
    反射机制:Reflection(反射) 是Java语言被视为动态语言的关键,反射机制允许程序在执行期借助于ReflectionAPI取得任何类的内部信息,并能直接操作对象的内部属性以及方法。加载完类之后,在堆内存的方法区中就产生了一个Class类型的对象(一个类只有一个Class对象), 这个对象包含......
  • JAVA中的IO流技术(JAVA基础)
    IO流的基础概念1.如何理解IO1.输入(Input)指的是:可以让程序从外部系统获得数据(核心含义是“读”,读取外部数据)。2.输出(Output)指的是:程序输出数据给外部系统从而可以操作外部系统(核心含义是“写”,将数据写出到外部系统)。3.java.io包为我们提供了相关的API,实现了对所有外......
  • Java基础
    Java基础部分,包括语法基础,泛型,注解,异常,反射和其它(如SPI机制等)。@立刀旁目录#1.1语法基础#面向对象特性?#a=a+b与a+=b的区别#3*0.1==0.3将会返回什么?true还是false?#能在Switch中使用String吗?#对equals()和hashCode()的理解?#final、fin......
  • Java使用线程实现异步运行
    在Java中,实现异步运行的一个常用方式是使用Thread类。下面,我将给出一个详细且完整的示例,该示例将创建一个简单的异步任务,该任务将模拟一个耗时的操作(比如,模拟网络请求或文件处理)。1.使用Thread类实现异步运行假设我们有一个任务,该任务需要模拟一个耗时操作,比如从网络下载一个大......
  • Java使用线程实现异步运行
    在Java中,实现异步运行的一个常用方式是使用Thread类。下面,我将给出一个详细且完整的示例,该示例将创建一个简单的异步任务,该任务将模拟一个耗时的操作(比如,模拟网络请求或文件处理)。1.使用Thread类实现异步运行假设我们有一个任务,该任务需要模拟一个耗时操作,比如从网络下载一......
  • java中stream流的操作详解
    1.Java8之后引入的Stream流为我们提供了便捷的集合数据处理方式一,常用方法1.filter;过滤集合中符合条件的数据2.distinct();过滤掉集合中重复的元素,过滤的是所有元素都相同的对象3.sorted();对集合中元素进行排序,用来排序的元素类型必须是int才行4.limit(longn);返回前n个......
  • 从jvm层面搞懂java的i++
    >本博客将从java字节码的层面解剖为什么i=0;i=i++;仍然会等于0字节码解析:iconst_x:代表将常量x放到操作数栈中istore_x:其中x必须是局部变量表中的一个合法下标,然后我们会从操作数栈中弹出对应的栈尾的元素(需要是int)以之来进行设置iload_x:则是加载对应的局部变量表的x......
  • Java流程控制
    Scanner对象Java给我们提供了这样一个工具类,我们可以获取用户的输入。java.util.Scanner是Java5的新特征,我们可以通过Scanner类来获取用户的输入。基本语法:Scanners=newScanner(System.in);通过Scanner类的next()与nextLine()方法获取输入的字符串,在读取前我们一般......
  • Java [ 基础 ] 方法引用 ✨
    ✨探索Java基础✨Java基础:方法引用方法引用是Java8中引入的一种新特性,它使得代码更加简洁和易读。方法引用提供了一种可以直接引用已有方法作为Lambda表达式的替代方案。本文将深入介绍方法引用的基本概念、使用方法、具体实例及其在实际开发中的应用。什么是方法引用?方法......