String、StringBuilder、StringBuffer 有什么区别?

news2024/11/19 19:25:42

1、典型回答

String、StringBuilder 和 StringBuffer 都是 Java 语言中,用于操作字符串的类,但它们在性能、可变性和线程安全性方面有一些区别

1、String:不可变字符串类,也就是说一旦创建,它的值就不可变。每次对 String 进行拼接、裁剪等操作时,都会创建一个新的 String 对象,所以它的这些操作效率不高,但由于其不可变性,String 可以保证线程安全,适用于字符串不经常变化的场景

2、StringBuffer:线程安全的可变字符串类,它解决了 String 字符串拼接、裁剪的问题,它提供了对字符串进行操作的 append 和 insert 等方法,可以将字符串添加到末尾或指定位置,并且它不会创建新字符串。并且 StringBuffer 是线程安全的,适用于多线程环境下对字符串的操作,其诞生于 JDK1.0

3、StringBuilder:非线程安全的可变字符串类,与StringBuffer 类似,但是它去掉了线程安全的部分,有效减小了开销,是绝大部分情况下进行字符串拼接的首选,它诞生于JDK1.5

2、全面剖析

将 String 设计为不可变的,可以更好用于缓存、保证线程安全、并提高程序的性能,但它的副作用就是在字符串拼接和裁剪的时候总要创建新字符串,性能不高,因此字符串变化的场景中要使用 StringBuffer 来替代,但 StringBuffer 底层使用了 synchronized 修饰在 append 等拼接方法上,如下源码所示:

所以,StringBuffer 效率也不是很高,于是在 JDK 1.5 的时候就有了去掉锁,但功能和 StringBuffer 完全相同的 StringBuilder 

3、知识扩展

关于字符串还有几个问题比较重要:

  1. StringBuffer 和 StringBuilder 有什么关系?它们的底层是如何实现的?
  2. intern() 方法的作用是啥?为什么要用 intern() 方法?它有什么副作用么?

3.1、StringBuilder 和 StringBuffer 底层实现

属于 “亲兄弟”的关系,因为它们都继承了同一个类 AbstractStringBuilder ,如下图所示:

String 的底层是使用数组实现的,而 StringBuilder 和 StringBuffer 的底层也是使用数组实现的,只是 StringBuilder 和 StringBuffer 的数组并未加 final 修饰,实现源码如下:

3.2、intern 方法说明

String 的 intern() 方法用于将字符串添加到字符串常量池中,并返回常量池中对应的字符串对象的引用

常量池是Java 运行时环境中的一个特殊存储区域,用于存储在编译期间确定的字符串常量和符号引用。当调用String的 intern() 方法时,如果常量池中已经存在相同值的字符串,则返回对应的引用;如果常量池中不存在,则在常量池中创建并返回对应的引用

例如以下代码:

String 创建对象的方式中,直接字符串赋值也就是 str1 的方式会默认将在常量池中创建对象,而new 对象的方式也就是str2的方式则是在堆上创建的

intern 方法的副作用主要有以下两个:

  1. 代码中大量使用 intern 方法会使得代码臃肿,且不易维护
  2. 使用 intern 方法会增加方法区的内存占用,而老版本的方法区是存储在永久代中的(JDK1.7之前),而永久代的空间又很小,因此如果 intern 方法使用不当,就会导致频频进行垃圾回收,所以在老版本要慎用 intern 方法 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1514448.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于java+springboot+vue实现的停车场管理系统(文末源码+Lw)23-258

摘 要 如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解决一些老技术的弊端问题。因为传统停车场管理系统信息管理难度大,容错率低&…

HarmonyOS NEXT应用开发之深色跑马灯案例

介绍 本示例介绍了文本宽度过宽时,如何实现文本首尾相接循环滚动并显示在可视区,以及每循环滚动一次之后会停滞一段时间后再滚动。 效果图预览 使用说明: 1.进入页面,检票口文本处,实现文本首尾相接循环滚动&#x…

创建空的Numpy数组

参考:Creating Empty Numpy Array Numpy 是一个开源的 Python 扩展库,用于科学计算和数据分析。它提供了高性能的多维数组对象,以及在这些数组上进行的各种操作。 在 Numpy 中,可以使用 numpy 模块的 empty 函数来创建一个空的 …

Vue3全家桶 - Vue3 - 【1】前置准备和介绍(VsCode插件 + 组合式API和选项式API的比较)

一、前言 Vue2.7是当前、同时也是最后一个 Vue2.x 的次级版本更新。Vue2.7 会以其发布日期,即2022年7月1日开始计算,提供18个月的长期技术支持。在此期间,Vue2将会提供必要的bug修复和安全修复。但不再提供新特性。Vue2的终止支持时间是2023…

C++ 有边数限制的最短路 Bellman_ford算法(带负权边)

给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环, 边权可能为负数。 请你求出从 1 号点到 n 号点的最多经过 k 条边的最短距离,如果无法从 1 号点走到 n 号点,输出 impossible。 注意:图中可能 存在负权回路…

算法刷题Day4 | 24. 两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题 02.07. 链表相交、142.环形链表II

目录 0 引言1 两两交换链表中的节点1.1 我的解题1.2 注意事项 2 删除链表的倒数第N个节点2.1 我的代码2.2 报错原因分析 3 链表相交3.1 我的解题 4 环形链表II4.1 我的解题 🙋‍♂️ 作者:海码007📜 专栏:算法专栏💥 标…

10个让你事半功倍的工作效率技巧,让你成为高效率的现代人!

作为现代人,我们每天都在面对各种各样的任务和工作,有时候会因为繁忙而感到力不从心,导致效率变得非常低下。所以,在这篇文章中,我将分享10个能够帮助你提高工作效率的技巧,让你的工作事半功倍。 1. 制定计…

labview中6种机械动作的区别

1.单击时转换:单击时转换,需要手动转换或者赋值回复原来状态; 2.释放时转换:释放时时转换,需要手动转换或者赋值回复原来状态; 3.单击时转换保持到鼠标释放:触发两次,自动恢复原来状…

ppocr ERROR: When parsing line KeyError: None

训练百度飞桨 paddleOCR模型。 数据集没有问题,但报以上错误。 发现是手欠,多按了下回车,多了个 - 删掉就好了。

map和set的介绍和使用

文章目录 map和set关联式容器键值对set介绍模板参数 map介绍模板参数为什么map支持下标访问 multiset介绍 multimap map和set 关联式容器 我们在之前讲过STL的一些基础容器,例如vector,list,deque,forward_list等 这些其实统一…

Script标签中 defer 和 async 属性的区别

script 标签中 defer & async 属性 如果我们注意过 html 中的 <script> 标签&#xff0c;就会发现在有的加载 JavaScript 文件的 <script src"https://code.jquery.com/jquery-3.7.1.min.js" defer></script>这里就探讨一下 script 标签上的…

[AutoSar]BSW_Com013 CAN TP 模块配置

目录 关键词平台说明一、缩写对照表二、Functional Description&#xff08;vector&#xff09;2.1 Asynchronous and Synchronous behavior of CanTp_Transmit2.1.1 asynchronous 2.1.2 synchronous2.2 Separation Time by Application 三、CanTpChannels3.1 接收端3.2 发送端…

【Web】浅聊Java反序列化之C3P0——URLClassLoader利用

目录 前言 C3P0介绍 回归本源——序列化的条件 利用链 利用链分析 入口——PoolBackedDataSourceBase#readObject 拨云见日——PoolBackedDataSourceBase#writeObject 综合分析 EXP 前言 这条链最让我眼前一亮的就是对Serializable接口的有无进行了一个玩&#xff0c…

day42 动态规划part4

先遍历物品还是先遍历背包二刷再考虑吧。累了&#xff0c;不想停留太久。 背包问题 二维 &#xff08;卡码网题目&#xff09; 各种解释&#xff1a; 要理解的是这个表格每一个格子都是当前所处情况的最大价值&#xff0c;我们用已经推导出的最大价值来推导当前情况的最大价值…

2.案例、鼠标时间类型、事件对象参数

案例 注册事件 <!-- //disabled默认情况用户不能点击 --><input type"button" value"我已阅读用户协议(5)" disabled><script>// 分析&#xff1a;// 1.修改标签中的文字内容// 2.定时器// 3.修改标签的disabled属性// 4.清除定时器// …

GUROBI之数学启发式算法Matheuristics

参考运小筹的帖子&#xff1a;优化求解器 | Gurobi 数学启发式算法&#xff1a;参数类型与案例实现 - 知乎 (zhihu.com) 简言之&#xff0c;数学启发式是算法就是数学规划和启发式算法的融合&#xff0c;与元启发式算法相比&#xff0c;数学启发式算法具有更强的理论性。 在GUR…

WEB区块链开发组件 - KLineChart

当我们开发区块链的时候&#xff0c;实现K线可能大家会想到EChart&#xff0c;但是EChart做可能需要耗费大量工作量&#xff0c;实现出来的功能估计也是牵强着用。 这时候&#xff0c;我们可能网上会搜索到TradingView,可是这个组件虽然功能非常强大&#xff0c;但是还是要费事…

视觉图像处理和FPGA实现第三次作业--实现一个加法器模块

一、adder模块 module adder(ina, inb, outa); input [5:0] ina ; input [5:0] inb ; output [6:0] outa ;assign outa ina inb; endmodule二、add模块 module add(a,b,c,d,e); input [5:0] a ; input [5:0] b ; input [5:…

Matlab R2021a安装教程(附带免费安装包)

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 Matlab简介 Matlab是一种高级技术计算语言和交互式环境&#xff0c;用于算法开发、数据可视化和数值计算。它集成了数学、工程和科…

unity中实现场景跳转

1&#xff0c;第一步创建2个场景&#xff08;右键资源窗口&#xff0c;名字这里我取的1111和2222&#xff09; 2.添加跳转按钮&#xff08;双击其中一个场景并添加按钮&#xff09; 3.编辑按钮的文字&#xff08;将原本的按钮打开点击里面的text&#xff0c;就可以在右边编辑文…