Java学习笔记(04)String与可变字符序列:StringBuffer、StringBuilder的区别

news/2024/12/22 18:42:32/

前言:

        因为String对象是不可变对象,虽然可以共享常量对象,但是对于频繁字符串的修改和拼接操作,效率极低,空间消耗也比较高。因此,JDK又在java.lang包提供了可变字符序列StringBuffer和StringBuilder类型。

        StringBuilder 和 StringBuffer 非常类似,均代表可变的字符序列,而且提供相关功能的方法也一样。

区分String、StringBuffer、StringBuilder

  1.         String:不可变的字符序列; 底层使用char[]数组存储(JDK8.0中)
  2.         StringBuffer:可变的字符序列;线程安全(方法有synchronized修饰),效率低;底层使用char[]数组存储 (JDK8.0中)
  3.        StringBuilder:可变的字符序列; jdk1.5引入,线程不安全的,效率高;底层使用char[]数组存储(JDK8.0中)

常用API

(1)StringBuffer append(xx):提供了很多的append()方法,用于进行字符串追加的方式拼接

(2)StringBuffer delete(int start, int end):删除[start,end)之间字符

(3)StringBuffer deleteCharAt(int index):删除[index]位置字符

(4)StringBuffer replace(int start, int end, String str):替换[start,end)范围的字符序列为str

(5)void setCharAt(int index, char c):替换[index]位置字符

(6)char charAt(int index):查找指定index位置上的字符

(7)StringBuffer insert(int index, xx):在[index]位置插入xx

(8)int length():返回存储的字符数据的长度

(9)StringBuffer reverse():反转

     使用总结

  1. 如果要操作少量的数据,用String ;单线程操作大量数据,用StringBuilder ;多线程操作大量数据,用StringBuffer。
  2. 不要使用String类的"+"来进行频繁的拼接,因为那样的性能极差的,应该使用StringBuffer或StringBuilder类,这在Java的优化上是一条比较重要的原则。
  3. 相同情况下使用 StringBuilder 相比使用 StringBuffer 仅能获得 10%~15% 左右的性能提升,但却要冒多线程不安全的风险。而在现实的模块化编程中,负责某一模块的程序员不一定能清晰地判断该模块是否会放入多线程的环境中运行,因此:除非确定系统的瓶颈是在 StringBuffer 上,并且确定你的模块不会运行在多线程模式下,才可以采用 StringBuilder;否则还是用 StringBuffer。
  4. 为了获得更好的性能,在构造 StringBuffer 或 StringBuilder 时应尽可能指定它们的容量。当然,如果你操作的字符串长度(length)不超过 16 个字符就不用了,当不指定容量(capacity)时默认构造一个容量为16的对象。不指定容量会显著降低性能。

参考:https://blog.csdn.net/m0_62729850/article/details/140299126


http://www.ppmy.cn/news/1516563.html

相关文章

opencv-4.8.0 Yes everything works with CUDA 12.3 and cuDNN 8.9.7.

opencv-4.8.0 CUDA 12.3 DNN 8.9.7 完美编译运行 脚本: sudo apt-get install libeigen3-dev sudo apt-get install protobuf-compiler sudo apt-get install libeigen3-dev sudo ln -s /usr/include/eigen3/Eigen /usr/include/Eigen cd ${current_path}/deps…

8月26日,恭喜CUUG 肖同学获得19c OCM证书!

8月26日,恭喜CUUG 肖同学获得Oracle 19c OCM证书。 19c OCM 考试大纲: Skillset 1:常用数据库与网络管理 Skillset 2.1:管理数据库的可用性 Skillset 2.2:数据仓库管理 Skillset 2.3:数据管理 Skillse…

【ORACLE】如何使用 EXPLAIN PLAN来分析和优化包含 GROUP BY 的查询?

在Oracle数据库中,使用EXPLAIN PLAN来分析和优化包含GROUP BY的查询是一个重要的性能调优步骤。以下是如何使用EXPLAIN PLAN来分析这类查询,并提供一些优化建议的步骤: 步骤 1: 生成执行计划 首先,你需要为包含GROUP BY的查询生…

MySQL中的锁详解

1.概念 锁是计算机协调多个进程或者线程并发访问某一资源的机制。那么如何保证数据并发访问的一致性、有效性是数据库必须解决的一个问题,锁的冲突也是影响数据库并发访问性能的一个重要因素,所以数据库中锁的应用极为重要,其复杂度也更高。 …

Kafka的生产者和消费者机制

目录 1.基础的客户端 1.1消息发送者的主流程 1.2消息消费者主流程 2.客户端工作机制 2.1消费者分组消费机制 2.2生产者拦截器机制 2.3消息序列化机制 2.4消息分区路由机制 2.5生产者消息缓存机制 2.6发送应答机制 2.7生产者消息幂等性 (1)生产者消息幂等性介绍 (2…

sql报错之 : The user specified as a definer (‘xxx‘@‘%‘) does not exiet

报错详情 : 其中这个xxx是在定义触发器的时候 的 定义者 , 触发器详情代码 : ## 创建新增评论数据触发器,一旦新增评论则对应视频的评论量加一 CREATE DEFINERxxx% TRIGGER increment_comment_count AFTER INSERT ON comment FOR EACH ROW BEGINUPDAT…

mac在终端中使用vscode打开文件或者文件夹

在Mac上使用Visual Studio Code(VSCode)打开指定文件夹,你可以通过以下步骤操作: 1.创建软连接 1.找到VSCode的安装位置。在Finder中,导航到/Applications/Visual Studio Code.app 2.进入VSCode的内容文件夹&#x…

小琳AI课堂:使用ChatGPT API搭建系统(二)

🎉 Python与ChatGPT API的奇妙之旅 🎉 大家好,欢迎回到小琳AI课堂!今天我们要探索的是如何在“使用ChatGPT API搭建系统”课程中,用Python代码与ChatGPT API进行有趣的互动。准备好了吗?让我们开始吧&#…