为什么 StringBuffer 有 toStringCache 而 StringBuilder 没有?

2023-12-20

在 JDK 8 中,StringBuffer类有一个toStringCache, while StringBuilder没有。

/**
 * A cache of the last value returned by toString. Cleared
 * whenever the StringBuffer is modified.
 */
private transient char[] toStringCache;

But why?

  • 我能想到的一个可能的原因是 StringBuffer 已经同步,因此可以更容易地实现缓存。

  • 或者也许历史上 StringBuffer 就是以这种方式实现的,所以旧代码很大程度上依赖于这个功能?

考虑到现代 JVM 具有逃逸分析和偏向锁定,这种差异还有意义吗?


考虑历史背景可能会有所帮助。StringBuilder是随 Java 5 一起引入的,因为人们已经认识到,StringBuffer不太适合其实际用例。

新推出的StringBuilder专为在纯粹的本地环境中构建、使用并随后立即丢弃的主要用例而设计。因此,它不提供任何同步,也不会费心优化其罕见的情况toString()方法被多次调用而没有中间变化(这种情况在现实生活中什么时候发生?),特别是事实上,在不牺牲无线程同步的性能优势的情况下提供缓存功能,是介于“困难”和“困难”之间的。 “不可能的”。

While StringBuilder被记录为不是线程安全的,所以你知道在并发调用它的方法时可能会发生不一致的事情,该类String通过不变性保证线程安全,因此,决不允许StringBuilder缺乏同步可能会导致已构造的字符串不一致,并且不共享数组String and StringBuilder无论如何,这是最安全的解决方案。

既然这种优化在现实生活中几乎没有任何好处,那么为什么还要进行这种优化呢?嗯,因为它已经存在很长时间了,很可能甚至从 Java 1.0 开始,并且不值得更改类中的任何内容StringBuffer。它的存在可能没有任何真正的优势,但删除它也没有任何好处,这需要新的测试等,并且可能会成为空格键过热功能 https://xkcd.com/1172/对于某些应用程序...

您可能会注意到,当时在 Java 1.x 中做出的许多设计决策在今天看来可能很奇怪。过度使用synchronized基础类就是其中之一,这几乎无法帮助优化另一类。当时,甚至连不变性的含义也没有得到很好的理解,这就是为什么我们有像这样的冗余方法String.valueOf(char[]) https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#valueOf-char:A- and String.copyValueOf(char[]) https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#copyValueOf-char:A-,加上使用的机会new String(char[]) https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#String-char:A-

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

为什么 StringBuffer 有 toStringCache 而 StringBuilder 没有? 的相关文章

随机推荐

  • 无法更改密钥库格式

    我正在尝试使用一些密钥库keytool来自最新的 JRE 版本 1 8 0 151 当我使用此命令创建密钥库时keytool genkey alias serverprivate keystore server private keyalg
  • MySQL“SELECT LIMIT 1”有多条记录是否从顶部选择第一条记录?

    我搜索了又搜索 找不到这个问题的答案 我可能以错误的方式问了它 我正在查询员工数据库 我需要根据职位 ID 获取详细信息 但是该职位 ID 可能有多个记录 因为该组织拥有针对同一职位的长期员工和临时员工 因此 为了获取位置 id 的当前占用
  • SQL Left Join 不返回所有结果

    我有两张表正在尝试为正在经历流程的客户加入 所有客户都会进入第一步 但只有部分进展到第二步 表 2 客户可能会在不同时间多次启动此流程 并且可能会在几个月 几个月或几个月内进入第二步 我想知道有多少人取得了这一进展 以表格为例 Table
  • VB.NET 不同范围的嵌套 With 语句

    我想知道这是否可能 我有一个列表表 lstTable 它与我试图用公共结构 ELEM DATA 中的信息填写的表单相同 我知道如果嵌套 with 语句在同一范围内 则它会起作用 但我该如何使用下面的示例 2 来做到这一点 示例1 With
  • 由于没有系统应用程序而终止?

    最近有没有人在 XCode 中遇到错误消息 由于没有系统应用程序而终止 我有一个在 iOS 8 1 和 XCode 6 1 上运行的 CoreAudio 应用程序 使用 Amazing Audio Engine 框架构建 自 XCode 6
  • 如何设置在 Windows 登录屏幕上打开应用程序的按钮

    这是我的第一个问题 我想知道是否有办法在登录屏幕上设置按钮来打开自定义应用程序 我已经搜索了 Microsoft 文档 然后找到了有关凭据提供程序的信息 但我不想创建 IU 登录名 我只想打开一个这样的应用程序 这就是我想要实现的目标 ht
  • Yii2 Gridview - 如何在页脚属性上使用总计

    我的 VALUE 列是 attribute gt value format gt raw contentOptions gt style gt width 10 text align left footer gt 如何使用 FOOTER 属
  • 用 Java 生成的轻量级 Web 服务(没有应用程序服务器)[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 是否有任何 Java 库允许在没有任何应用程序服务器框架的情况下构建简单的独立 Web 服务服务器 Java 6 包含 JAX WS 这使
  • 如何防止在分离的 HEAD 中提交

    为什么 git 允许你提交一个独立的头 是否有任何预提交挂钩可以禁用它 什么目的 许多新开发人员都会这样做 我想找到一种方法来禁用它 这只能通过本地 git 来防止pre commithook 因此开发人员需要创建它 添加your loca
  • 带 DataPager 的 ListView 不起作用

    从我读过的所有内容来看 向 ListView 控件添加分页似乎应该非常简单 但它对我不起作用 将 ListView 和 DataPager 控件添加到窗体并将它们连接在一起后 我得到了非常奇怪的行为 DataPager 正确限制了 List
  • Directory.CreateDirectory异常

    我在用Directory CreateDirectory MyShared Pics NewFolder 在目录中创建一个新文件夹 MyShared Pics我遇到了一个例外 Access to the path MyShared Pics
  • android.graphics.BitmapFactory.nativeDecodeAsset(本机方法)处的 java.lang.OutOfMemoryError

    我正在尝试在单击按钮时执行动画 步骤如下 单击按钮 按钮图像发生变化 播放动画 显示下一个布局 但我遇到了内存不足的异常 当动画文件未添加到项目中时 没有错误 但自从加入了动画之后 问题就出现了 我在这里使用 3 个类文件 home scr
  • Android Facebook 登录没有 Facebook 登录按钮

    我想使用 Facebook 登录而不使用 Facebook 登录按钮 所以我在默认的android按钮上应用了点击事件 但我得到了错误cannot resolve method logInWithReadPermissions 这是我的代码
  • Groovy:安装后编译器不匹配

    我在用grails 2 3 4与eclipse grails plugin GGTS 但是 安装后我创建了一个项目并得到 Description Resource Path Location Type Groovy compiler mis
  • 回形针可以读取 S3 存储桶中的照片几何形状吗?

    我想从我的 S3 容器中读取照片的几何形状 当它在我本地时 这有效 def photo geometry style original geometry geometry style Paperclip Geometry from file
  • 如何使用 CSS2 选择器获取元素的第 n 个子元素?

    CSS2 中是否有可能获取有序列表的第 n 个元素 如同 nth child 在 CSS3 中 仅供参考 我正在尝试将 Parcheesi 的德语版本编程为兼容 XHTML 1 1 和 CSS2 并尝试使用有序列表生成游戏场 因此移动选项是
  • jQuery 如果 myDiv 是:可见,则将类添加到另一个元素

    我又开始接触 jQuery 了 显然我错过了一些东西 我想根据另一个元素是否可见向元素添加一个类 它隐藏着display none 并激活slideToggle 我有这个 if about me is visible about me cl
  • 如何使用本地开发 minikube 进入 Kubernetes 中的 postgres

    有人可以帮我吗 这是我在这里发表的第一篇文章 我真的很高兴开始在这里发帖并帮助人们 但我首先需要帮助 我正在 Minikube 上部署我自己的 Postgres 数据库 对于数据库 密码和用户名 我使用的是秘密 数据采用base64编码 P
  • 在基于服务器的代理中使用 REST 服务

    我们被要求构建一个基于 Domino 服务器的数据库 用于与远程非 Domino 服务器交换数据 可以使用 Web 服务连接到远程服务器 使用 R8 5 3 在 Domino 中创建 RESTful 服务似乎很简单 Internet 上有一
  • 为什么 StringBuffer 有 toStringCache 而 StringBuilder 没有?

    在 JDK 8 中 StringBuffer类有一个toStringCache while StringBuilder没有 A cache of the last value returned by toString Cleared whe