首页 > 其他分享 >StringBuffer和StringBuilder问题

StringBuffer和StringBuilder问题

时间:2023-02-04 22:11:47浏览次数:53  
标签:String StringBuffer CharSequence 问题 线程 StringBuilder 字符串

Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串。String 类是不可变类,即一旦一个 String 对象被创建以后,包含在这个对象中的字符序列是不可改变的,直至这个对象被销毁。

Java 提供了两个可变字符串类 StringBuffer 和 StringBuilder,中文翻译为“字符串缓冲区”。

StringBuilder 类是 JDK 1.5 新增的类,它也代表可变字符串对象。实际上,StringBuilder 和 StringBuffer 功能基本相似,方法也差不多。不同的是,StringBuffer 是线程安全的,而 StringBuilder 则没有实现线程安全功能,所以性能略高。因此在通常情况下,如果需要创建一个内容可变的字符串对象,则应该优先考虑使用 StringBuilder 类。

StringBuffer、StringBuilder、String 中都实现了 CharSequence 接口。CharSequence 是一个定义字符串操作的接口,它只包括 length()、charAt(int index)、subSequence(int start, int end) 这几个 API。

StringBuffer、StringBuilder、String 对 CharSequence 接口的实现过程不一样,如下图 1 所示:

 

 

对CharSequence接口的实现 图 1 对CharSequence接口的实现

可见,String 直接实现了 CharSequence 接口,StringBuilder 和 StringBuffer 都是可变的字符序列,它们都继承于 AbstractStringBuilder,实现了 CharSequence 接口。

总结

String 是 Java 中基础且重要的类,被声明为 final class,是不可变字符串。因为它的不可变性,所以拼接字符串时候会产生很多无用的中间对象,如果频繁的进行这样的操作对性能有所影响。

StringBuffer 就是为了解决大量拼接字符串时产生很多中间对象问题而提供的一个类。它提供了 append 和 add 方法,可以将字符串添加到已有序列的末尾或指定位置,它的本质是一个线程安全的可修改的字符序列。

在很多情况下我们的字符串拼接操作不需要线程安全,所以 StringBuilder 登场了。StringBuilder 是 JDK1.5 发布的,它和 StringBuffer 本质上没什么区别,就是去掉了保证线程安全的那部分,减少了开销。

线程安全:

StringBuffer:线程安全 StringBuilder:线程不安全

速度:

一般情况下,速度从快到慢为 StringBuilder > StringBuffer > String,当然这是相对的,不是绝对的。

使用环境:

操作少量的数据使用 String。 单线程操作大量数据使用 StringBuilder。 多线程操作大量数据使用 StringBuffer。

标签:String,StringBuffer,CharSequence,问题,线程,StringBuilder,字符串
From: https://www.cnblogs.com/GO8k/p/17092516.html

相关文章

  • 解决vuepdf不显示章印问题
    找到node_modules/pdfjs-dist/es5/build/pdf.worker.js这个目录if(data.fieldType==="Sig"){data.fieldValue=null;//pdf预览不显示红章问题......
  • ChatGPT 有哪些神奇的使用方式?使用chargpt写代码 搜索问题 写论文
    本教程介绍chargpt使用教程:不需要梯子,不需要注册,也不需要缴纳费用通过本教程您将会使用chargpt写代码搜索问题写论文。我展示了两个问题问题一:用python写一个学生信......
  • nginx相关配置问题
    nginx常用功能http代理正向代理和反向代理Nginx可以根据不同的正则匹配,采取不同的转发策略,比如图片文件结尾的走文件服务器,动态页面走web服务器,只要你正则写的没问题,......
  • netcore 部署问题集
    一、IIS    ①、x86部署问题1、错误信息(附截图):Couldnotfind'aspnetcorev2_inprocess.dll'.Exceptionmessage:2、错误信息(附截图):Failedtostartapplic......
  • 记一次使用gdb诊断gc问题全过程
    原创:扣钉日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处。简介上次解决了GC长耗时问题后,系统果然平稳了许多,这是之前的文章《GC耗时高,原因竟是服务流量小?》然而,过了......
  • stream流中toMap()api和Duplicate key问题
    1、指定key-value,value是对象中的某个属性值。Map<Integer,String>userMap=userList.stream().collect(Collectors.toMap(User::getId,User::getName));2、指定key......
  • 一次因内存引用引发的数据重复的问题
    前言第一次使用expandablelistview,其中要创建一个二维的arraylist,但在使用过程中导致一直出现数据重复的状况,入图所示当独立打开一组并关闭其他组时,显示正常。但当打开......
  • vite(vue3)问题汇总(一)--- 基于vite的项目,修改node_modules中引用的包,但是开发模式下,
    ① 基于vite的项目,修改node_modules中引用的包,但是开发模式下,不会检测到改变的问题:为了提高运行速度,vite在首次运行时,对node_modules中的包进行了esmodule化,存储在n......
  • 死机-如何从硬件角度分析解决产品死机问题
    经常有客户碰到产品死机问题,下面从硬件角度讲解处理上电死机这类问题的解决思路。一、BOOT状态若晶振原因排除,可以查看一下客户boot脚电平状态。若想要正常运行用户代码,......
  • C++ atomic的Cacheline及Memory fence问题
    我们都知道多核编程常用锁避免多个线程在修改同一个数据时产生racecondition。当锁成为性能瓶颈时,我们又总想试着绕开它,而不可避免地接触了原子指令。但在实践中,用原子指......