StringBuffer 存在的含义

位置:首页>文章>详情   分类: Java教程 > 编程技术   阅读(250)   2023-11-14 16:34:57

当我处理遗留代码并运行 StringBuffer 实例时,我通常将它们替换为 StringBuilder 实例。虽然可以从这个更改中获得性能优势,但我经常在我知道对性能影响不大的地方进行更改。我觉得除了潜在的性能优势之外,出于各种原因值得进行更改。 很少有理由不选择 StringBuilder 而不是 StringBuffer(API 期望是最常见的例外)并且 $ 中的代码误导并为 Java 新手提供了一个不好的例子。

The Pragmatic Programmer: From Journeyman to Master 一书中,Andy Hunt 和 David Thomas 讨论“修复代码中的小问题,即‘破窗’的重要性。 ” Jeff Atwood 在破窗理论一文中谈到了这个主题,最近在软件腐烂、熵和破窗理论一文中也提到了这个问题不要留下破窗StringBuffer 的存在意味着代码中的陈旧性。实际上,StringBuffer 的使用可能不是“破窗”,而是一个非常老旧、漏水的单窗格窗口,应该用现代的、充满活力的-高效的双窗格窗口

我发现 Peter Lawrey 最近的博文 StringBuffer, and how hard it to get ridge of legacy code 是对 StringBuffer< 其他含义的有趣解读/code> 仍然存在于代码中。 Lawrey 引用了 StringBuffer 类 Javadoc 文档的最后一段,“从 JDK 5 开始,这个类已经补充了一个为单线程使用而设计的等效类,StringBuilder。通常应优先使用 StringBuilder 类,因为它支持所有相同的操作,但速度更快,因为它不执行同步。” Lawrey 然后使用简单的 Java 方法和 jmap 来证明 $ 的实例仍然在 JDK 提供的类和库中使用,甚至晚至 Java 8。

Lawrey 指出,在引入“直接替换”StringBuffer 十多年后,频繁使用的 Java 代码中出现了 StringBuilder,这证明了它是多么困难“清理遗留代码。” Lawrey 的完整总结指出,“在启动时使用 StringBuffer 没有太大区别,但考虑到它有一个众所周知的替代品,它仍在使用,即使在十多年的新功能中也是如此后来表明清理遗留代码或改变思维以让人们使用最佳实践库是多么困难。”

我决定在使用 Java 8 Update 121 编译时以及使用最新版本的 OpenJDK 9 编译时尝试 Lawrey 的最简单示例之一。我(稍微)将 Lawrey 的示例改编为简单的“主”类列表接下来显示。

主.java

import java.io.IOException;

/**
 * (Slightly) adapted class from blog post
 * "StringBuffer, and how hard it is to get rid of legacy code" at
 * https://vanilla-java.github.io/2017/04/13/String-Buffer-and-how-hard-it-is-to-get-rid-of-legacy-code.html
 */
public class Main
{
   /**
    * Main function that instantiates this Java "application" and does nothing
    * else until "ENTER" is pressed.
    */
   public static void main(final String[] args) throws IOException
   {
      System.out.println("Waiting [press ENTER to exit] ..");
      System.in.read();
   }
}

以下屏幕快照显示了使用 jcmd 及其 -all 选项(包括检查中无法访问的对象)的输出,以显示 StringBuffer$ 在针对三个不同版本的 Java(Java 8 Update 102Java 8 Update 121、和 OpenJDK 9.0 ea+164)。 jcmd 的执行是在 PowerShell 中执行的,因此 Select-String 的使用方式类似于 grep 在 Linux 中的使用方式。

虽然使用 Java 8 版本编译和执行的类版本具有 StringBuffer 实例,但使用 Java 9 编译和执行的版本只有 StringBuilder 实例。它看起来像 JDK-8041679(“在核心库类中用 StringBuilder 替换 StringBuffer 的使用”)和 JDK-8043342(“在核心库类中用 StringBuilder 替换 StringBuffer 的使用”)加密代码”)已经达到了预期的效果。

标签2: Java教程
地址:https://www.cundage.com/article/jcg-implications-presence-stringbuffer.html

相关阅读

Java HashSet 教程展示了如何使用 Java HashSet 集合。 Java哈希集 HashSet 是一个不包含重复元素的集合。此类为基本操作(添加、删除、包含和大小)提供恒定时间性...
SpringApplicationBuilder 教程展示了如何使用 SpringApplicationBuilder 创建一个简单的 Spring Boot 应用程序。 春天 是用于创建企业应...
通道是继 buffers 之后 java.nio 的第二个主要新增内容,我们在之前的教程中已经详细了解了这一点。通道提供与 I/O 服务的直接连接。 通道是一种在字节缓冲区和通道另一端的实体(通...
课程大纲 Elasticsearch 是一个基于 Lucene 的搜索引擎。它提供了一个分布式的、支持多租户的全文搜索引擎,带有 HTTP Web 界面和无模式的 JSON 文档。 Elasti...
解析器是强大的工具,使用 ANTLR 可以编写可用于多种不同语言的各种解析器。 在这个完整的教程中,我们将: 解释基础:什么是解析器,它可以用来做什么 查看如何设置 ANTLR 以便在 Java...
Java 是用于开发各种桌面应用程序、Web 应用程序和移动应用程序的最流行的编程语言之一。以下文章将帮助您快速熟悉 Java 语言,并迈向 API 和云开发等更复杂的概念。 1. Java语言...
Java中的继承是指子类继承或获取父类的所有非私有属性和行为的能力。继承是面向对象编程的四大支柱之一,用于提高层次结构中类之间的代码可重用性。 在本教程中,我们将了解 Java 支持的继承类型,...
Java Message Service 是一种支持正式通信的 API,称为 网络上计算机之间的消息传递。 JMS 为支持 Java 程序的标准消息协议和消息服务提供了一个通用接口。 JMS 提...
Java 项目中的一项常见任务是将日期格式化或解析为字符串,反之亦然。解析日期意味着你有一个代表日期的字符串,例如“2017-08-3”,你想把它转换成一个代表 Java 中日期的对象,例如Ja...
之前,我介绍了spring 3 + hibernate 集成 示例和struts 2 hello world 示例。在本教程中,我将讨论在将 spring 框架与 struts 与 hibern...