String、StringBuffer、StringBuilder三者的区别

2023-10-26

在前面的文章中,我们已经分别介绍了String、StringBuffer、StringBuilder三者的基本使用,还不懂String、StringBuffer、StringBuilder这三个类是如何使用的,可以先去看看之前的文章:Java:String类的使用

本文主要是介绍String、StringBuffer、StringBuilder之间的区别。


在前面的文章中,我们知道了String是具有不可变性的,由此我们就引出了可变性的StringBuffer类和StringBuilder类。

实际上,这三者在我们日常写代码的过程中都是会经常使用到的,那么既然其他两个类都是可变的,为什么我们还要使用String类呢?直接全部使用其他两个类不好吗?感觉使用String类有这么多的局限性,不可变对象到底有什么好处呢?

对于这种种的疑问,其实总结出来就是:为什么String要设计成不可变的?
原因有三:

  1. 方便实现字符串对象池,如果String可变,那么对象池就需要考虑写时拷贝的问题
  2. 不可变对象是线程安全的
  3. 不可变对象更方便缓存hashcode,作为key时可以更高效率地保存到HashMap中

那么对于StringBuffer类和StringBuilder类,他们是可以进行修改的,实际上他们的大部分功能也都是相同的,其中,最主要的区别就是:StringBuffer采用了同步处理,属于线程安全的操作;而StringBuilder并未采用同步处理,因此是属于线程不安全操作,这也是这两个类之间最大的区别点(关于线程安全但是知识点到后面学习到了在做解释)。


这时候可能有人会说:StringBuffer既是可修改的,又是线程安全的,那还要String类和StringBuilder类干嘛呢?之间全部使用StringBuffer不就行了吗?

其实String和StringBuilder中有一些其他东西是StringBuffer说不具备的,往往这些都是要通过代码的具体实现来决定的,不能一棒子打死说全部都使用StringBuffer,很显然是不恰当的,String在Java源码中出现的地方比比皆是,只能够说,在实现中写代码比较经常使用的是StringBuffer。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

String、StringBuffer、StringBuilder三者的区别 的相关文章

  • 任务“:app:dexDebug”执行失败

    我目前正在处理我的项目 我决定将我的 Android Studio 更新到新版本 但在我导入项目后 它显示如下错误 Information Gradle tasks app assembleDebug app preBuild UP TO
  • Android - 如何访问 onResume 中 onCreate 中实例化的 View 对象?

    In my onCreate 方法 我正在实例化一个ImageButton View public void onCreate Bundle savedInstanceState super onCreate savedInstanceSt
  • 检查双精度值的等于和不等于条件

    我在比较两者时遇到困难double values using and 我创建了 6 个双变量并尝试进行比较If健康 状况 double a b c d e f if a b c d e f My code here in case of t
  • 将链接对象转换为流或集合

    我想迭代堆栈跟踪 堆栈跟踪由可抛出对象组成 其 getCause 返回下一个可抛出对象 最后一次调用 getCause 返回 null 示例 a gt b gt null 我尝试使用 Stream iterable 这会导致 NullPoi
  • Java 泛型/类型调度问题

    考虑以下程序 import java util List import java util ArrayList public class TypeTest public static class TypeTestA extends Type
  • 如何将 Spotlight for Help 插入本地化的 macOS 应用程序?

    我正在 macOS 上使用 Swing GUI 框架实现 Java 应用程序 当使用system外观和感觉以及screen菜单栏 Swing 自动插入一个搜索栏 called 聚光灯寻求帮助 https developer apple co
  • Java 变量的作用域

    我不明白为什么这段代码的输出是10 package uno public class A int x 10 A int x 12 new B public static void main String args int x 11 new
  • Java替换特定字符

    这是我在这个网站上的第一个问题 所以我会尽量不要成为一个十足的菜鸟 我目前正在用java 创建刽子手游戏 所以我问你的问题是我们是否被赋予了 幽灵 这个词 并将 Ghost 替换为 hiddenWord ghost length for i
  • 使用 java 按电子邮件发送日历邀请

    我正在尝试使用 java 发送每封电子邮件的日历邀请 收件人收到电子邮件 但不会显示接受或拒绝的邀请 而是将该事件自动添加到他的日历中 我正在使用 ical4j jar 构建活动 邀请 private Calendar getInvite
  • 如何在java中使jpeg无损?

    有没有人可以告诉我如何使用编写 jpeg 文件losslessjava中的压缩 我使用下面的代码读取字节来编辑字节 WritableRaster raster image getRaster DataBufferByte buffer Da
  • 打印包含 JBIG2 图像的 PDF

    请推荐一些库 帮助我打印包含 JBIG2 编码图像的 PDF 文件 PDFRenderer PDFBox别帮我 这些库可以打印简单的 PDF 但不能打印包含 JBIG2 图像的 PDF PDFRenderer尝试修复它 根据 PDFRedn
  • 为什么 ConcurrentHashMap::putIfAbsent 比 ConcurrentHashMap::computeIfAbsent 更快?

    使用 ConcurrentHashMap 我发现computeIfAbsent 比putIfAbsent 慢两倍 这是简单的测试 import java util ArrayList import java util List import
  • 从 html 页面和 javascript 调用 java webservice

    我正在尝试从 javascript 调用 java 实现的 Web 服务 使用 NetBeans IDE 我读过很多关于 jQuery 和 AJAX 的内容 但我似乎无法掌握它 假设我的 Web 服务 WSDL 位于 http localh
  • 在 Selenium WebDriver 上如何从 Span 标签获取文本

    在 Selenium Webdriver 上 如何从 span 标记检索文本并打印 我需要提取文本UPS Overnight Free HTML代码如下 div id customSelect 3 class select wrapper
  • 如何在android sdk上使用PowerMock

    我想为我的 android 项目编写一些单元测试和仪器测试 然而 我遇到了一个困扰我一段时间的问题 我需要模拟静态方法并伪造返回值来测试项目 经过一些论坛的调查 唯一的方法是使用PowerMock来模拟静态方法 这是我的 gradle 的一
  • 我想要一个 Java 阿拉伯语词干分析器

    我正在寻找阿拉伯语的 Java 词干分析器 我找到了一个名为 AraMorph 的库 但它的输出是无法控制的 并且它会形成不需要的单词 还有其他阿拉伯语词干分析器吗 这是新的阿拉伯语词干分析器 Assem 的阿拉伯语轻词干分析器 http
  • 从java中的字符串数组中删除空值

    java中如何从字符串数组中删除空值 String firstArray test1 test2 test4 我需要像这样没有 null 空 值的 firstArray String firstArray test1 test2 test4
  • 如何将实例变量传递到 Quartz 作业中?

    我想知道如何在 Quartz 中外部传递实例变量 下面是我想写的伪代码 如何将 externalInstance 传递到此作业中 public class SimpleJob implements Job Override public v
  • MongoDB Java 驱动程序:MongoCore 驱动程序与 MongoDB 驱动程序与 MongoDB 异步驱动程序

    MongoDB Java 驱动程序有三种不同的驱动程序选项 核心驱动 MongoDB 驱动程序 MongoDB 异步驱动程序 The 驱动程序描述页面 https docs mongodb org ecosystem drivers jav
  • java中如何找到class文件的包

    我正在编写一个使用 class 文件的 java 程序 我希望能够读取文件系统上的 class 文件 使用 InputStream 并确定它所在的包 该 class 文件可能不在一个好的包目录结构中 它可能位于某个随机位置 我怎样才能做到这

随机推荐

  • flutter如何实现点击事件

    在Android中 您可以通过调用方法setOnClickListener将OnClick绑定到按钮等view上 在Flutter中 有两种方法 1 如果Widget支持事件监听 则可以将一个函数传递给它并进行处理 例如 RaisedBut
  • 华硕飞行堡垒进入bios

    1 关机重启 在重启时一直按住F2进入如下页面 2 按下F7 进入如下页面 3 通过移动键盘右键 gt 键 使界面来到Advanced 4 通过移动键盘下键 移动到Advanced中的SVM Mode 通过Enter键进行下拉选取 入下图小
  • unity知识学习(一)巨型太阳---组件Lens Flare的运用

    unity关于在天空设置一个巨型太阳 组件Lens Flare的运用 介绍 unity版本 如何制作巨型太阳 最基本的操作 如何制作巨型太阳 关键操作 我制作好的巨型太阳 介绍 本次知识前面比较简单 因此将基本操作和关键点操作分开 读者可方
  • CSS 实现文字渐变色

    1 background 属性设置渐变色 1 源码示例 text background image linear gradient to right pink purple color transparent webkit backgrou
  • eclipse New Server Runtime Environment 列表中没有 Apache Tomcat

    该问题主要原因可能是 Eclipse插件不全引起 按以下步骤安排插件即可 1 点击工具栏上的Help gt Install New Software 2在弹出的对话框的 Work with 输入 http download eclipse
  • 检查你的电脑是否支持硬件虚拟化技术

    有时候需要知道电脑是否支持硬件虚拟化技术 这种情况可能需要在在windown7系统上装MacOS 系统 通过使虚拟机 在虚拟机上安装出现如下问题是 首先 在更改你的BIOS设置之前 检测你的处理器是否支持硬件虚拟化技术 下载 securab
  • 等和子数组最小和(Java)

    题目描述 给定一个数组nums 将元素分为若干个组 使得每组和相等 求出满足条件的所有分组中 组内元素和的最小值 输入描述 第一行输入 m 接着输入m个数 表示此数组nums 数据范围 1 lt m lt 50 1 lt nums i lt
  • ElasticSearch从入门到精通:常用操作

    hello 大家好 我是 Jackpop 硕士毕业于哈尔滨工业大学 曾在华为 阿里等大厂工作 如果你对升学 就业 技术提升等有疑惑 不妨交个朋友 我是Jackpop 我们交个朋友吧 在前面这一部分 我已经解释了ElasticSearch的基
  • 51单片机四个并行I/O接口

    P0口 功能1 作为正常的并行I O接口 P1 P2 P3原理相同 控制端C 0 MUX开关向下 经过与门 T1截止 P0口作为输出口时 a 需要在三极管T2上部添加上拉电阻如图所示 b 内部总线输出数据为1 经过Q非得0 再经过MUX开关
  • 用python将时间序列信号或一维数组 转化成 图像的几种方法

    用python将时间序列信号或一维数组转化成图像的几种方法 深度学习在计算机视觉有了非常广泛的应用 视觉图像数据为二维数据 而在故障诊断领域的数据 来自于传感器的采集 属于典型的一维时间序列 因而绝大多数问题可以抽象成时间序列分类 TSC
  • Unity官方FPS教程解析(二)

    在上一篇文章中我们只是初步了解了这个游戏层次构造的一部分 今天我们继续上一章的内容吧 Enemy 两个enemy本质上没有差别 所以就其中一个来说说吧 Enemy Turret 这个初始场景的boss 一个站桩型敌人 当选中其根物体后我们可
  • Linux下SPI驱动详解及示例代码

    SPI Serial Peripheral Interface 是一种常用的串行通信协议 广泛应用于嵌入式系统中 在Linux系统中 SPI驱动负责管理和控制与SPI总线设备的通信 本文将详细介绍Linux下SPI驱动的工作原理 并提供示例
  • MES生产管理系统原型 MES产品原型 Axure产品原型

    MES生产管理系统原型 MES产品原型 Axure产品原型 1 生产管理 包括生产订单 生产计划 生产工单 工序任务单 报工记录 可提供高效的生产排程 2 质检管理 包括质检单 质检方案 检验项目 检验组管理 可提升质量追溯水平 3 库存管
  • uniapp tababr凸出图标已经自定义tabbar

    uniapp关于tabbar的文档 现在我想tabbar中间的显示为凸出的图标 类似下图 只需要在app中使用 不用兼容小程序的话 可以使用官方的midButton配置项 该配置项不兼容各种小程序 midButton height 70px
  • vue中使用el-upload组件修改上传的图片时,每次都会自动闪过上一次的图片

    引言 在进行vue后台管理系统开发的时候又遇到了这个问题 由于上次没有写文章记录 所以还是查看了之前写的项目才解决这个问题 遇到的问题 我将上传的表单单独作为一个组件 假设为A页面 然后在另外一个页面 假设为B页面 中使用Dialog来显示
  • 数据清洗,数据分析,数据挖掘的区别

    数据清洗 是指对原始数据进行预处理 包括去重 去噪 填充缺失值 处理异常值等操作 以提高数据的质量和可用性 保证分析和挖掘的可靠性 数据清洗是数据处理的基本步骤 也是数据分析和数据挖掘的前提 数据分析 是指利用统计学和数据科学技术对数据进行
  • linux 开发设计软件,在Linux平台下开发和设计聊天软件

    在网络无所不在的今天 在Internet上 有ICQ MSN Gtalk OICQ等网络聊天软件 极大程度上方便了处于在世界各地的友人之间的相互联系 也使世界好像一下子缩小了 不管你在哪里 只要你上了网 打开这些软件 就可以给你的朋友发送信
  • Python-第三方库的国内源

    清华 https pypi tuna tsinghua edu cn simple 阿里云 http mirrors aliyun com pypi simple 中国科技大学 https pypi mirrors ustc edu cn
  • 【WSL】[04]从C盘解放出来WSL的linux镜像

    前言 C盘的硬盘资源有限 虚拟机的需求无限 所以 要把无限的硬盘需求搞到其他盘去才行啊 方案1 利用工具 move wsl 1 管理员运行PowerShell 创建WSL的工作目录 移动前 C盘的空间大小 base PS C WINDOWS
  • String、StringBuffer、StringBuilder三者的区别

    在前面的文章中 我们已经分别介绍了String StringBuffer StringBuilder三者的基本使用 还不懂String StringBuffer StringBuilder这三个类是如何使用的 可以先去看看之前的文章 Jav