StringBuffer的存在的含义

当我处理旧代码并跨StringBuffer实例运行时,通常将它们替换为StringBuilder实例。 尽管可以从此更改中获得性能优势,但我经常在我知道对性能影响不大的地方对其进行更改。 我认为,除了可能带来性能收益外,还应出于各种原因进行更改。 几乎没有理由不选择StringBuilder不是StringBuffer (API期望是最常见的例外),并且代码中存在StringBuffer误导读者,并为Java新手提供了一个不好的例子。

Andy Hunt和David Thomas 在 《 实用编程器:从旅居者到大师 》一书中讨论了 “修复代码中的小问题“破窗”的重要性”。 杰夫·阿特伍德(Jeff Atwood)在“破窗理论”一文中谈到了这个主题,最近在“ 软件腐烂,熵和破窗理论 ”一文中对此进行了介绍,并且不要留下破窗 。 StringBuffer的存在暗含代码中的陈旧性。 实际上,使用StringBuffer可能不是一个“破损的窗口”,但它是一个真正古老的,泄漏的单窗格窗口 ,应将其替换为现代的,节能的双窗格窗口 。

我发现了Peter Lawrey在最近的博客文章StringBuffer中,摆脱遗留代码有多么困难,这是对代码中仍然存在的StringBuffer其他含义的有趣理解。 Lawrey引用了StringBuffer类Javadoc文档的最后一段,“从JDK 5版本开始,该类已经添加了一个等效类,供单线程StringBuilder使用。 通常应优先使用StringBuilder类,因为它支持所有相同的操作,但它更快,因为它不执行同步。” Lawrey然后使用简单的Java方法和jmap证明了StringBuffer实例仍在JDK附带的类和库中使用,甚至直到Java 8为止。

Lawrey指出,在引入“直接替换” StringBuilder十多年之后, StringBuffer在频繁使用的Java代码中的存在证明了“清理遗留代码”有多么困难。 Lawrey的完整结论指出:“在启动时使用StringBuffer并没有多大区别,但是考虑到它具有众所周知的替代性下降,并且仍在使用,即使在十多年后的新功能中也显示出它有多难清理遗留代码或改变思路,使人们使用最佳实践库。”

我决定在用Java 8 Update 121进行编译时以及在使用最新版本的OpenJDK 9进行编译时尝试使用Lawrey最简单的示例之一。我(略)将Lawrey的示例调整为下面所示的简单“ Main”类清单。

Main.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选项(检查中包括无法访问的对象)的输出,以显示在简单Java应用程序中编译并针对三种不同版本的Java( Java)运行StringBufferStringBuilder的实例数8更新102 , Java 8更新121和OpenJDK 9.0 ea + 164 )。 jcmd的执行是在PowerShell中执行的,因此Select-String的用法与Linux中的grep相似。

尽管使用Java 8版本编译和执行的类的版本具有StringBuffer实例,但是使用Java 9编译并针对Java 9执行的版本仅具有StringBuilder实例。 看起来JDK-8041679 (“在核心库类中用StringBuilder替换StringBuffer使用”)和JDK-8043342 (“在密码子中用StringBuilder替换StringBuffer使用”) 的解析已达到预期的效果。

翻译自: https://www.javacodegeeks.com/2017/04/implications-presence-stringbuffer.html

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

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

相关文章

matlab 大括号

大括号,用于cell型的数组的分配或引用。 >> acell(2,1)a [][]>> a(1,1)[2,3,4,0;5,6,7,8];无法从 double 转换为 cell。>> a(1,1){[2,3,4,0;5,6,7,8]};>> a(2,1){str};>> aa [2x4 double]str >>

J2EE项目代码编写规范分享

码编写规范目的:能够在编码过程中实现规范化,为以后的程序开发中养成良好的行为习惯。 代码编写规范使用范围:J2EE项目开发。 包命名规范: 目的:包的命名规范应当体现出项目资源良好的划分 servlet类所在包命名规范&am…

Socket套接字 =======================

http://www.cndartlang.com/841.html 转载于:https://www.cnblogs.com/pythonClub/p/10732555.html

matlab 中括号

中括号用来构建向量(Vectors)或者是矩阵(Matrices)。如[6.9 9.64 sqrt(-1)] 就是一个有三个元素的向量。[11 12 13; 21 22 23] 是个2*3的矩阵. 分号(;)用来结束一行。 中括号的另一个作用是在函数中,分配输出参数。 Matlab 方括号“[ ]”的作用 1定义矩阵&#xff…

mysql 左连接b表的一条数据_阿里java架构师教你怎么用mysql怒怼面试官

转载地址:阿里java架构教你怎么用mysql怒怼面试官​www.jianshu.com说一下mysql比较宏观的面试,具体咋写sql的这里就不过多举例了。后面我还会给出一个关于mysql面试优化的试题,这里主要说的索引和BTree结构,很少提到我们的集群配…

详解SQL中drop、delete和truncate的异同

第一:相同点: truncate和不带where子句的delete,以及drop 都会删除表内的数据 第二:不同点: 1. truncate和delete只删除数据不删除表的结构(定义) drop 语句将删除表的结构被依赖的约束(constrain)、触发器(trigg…

2039 三角形

三角形 http://acm.hdu.edu.cn/showproblem.php?pid2039 1 #pragma warning(disable:4996) 2 #include<stdio.h>3 int main()4 {5 int n;6 double a, b, c;7 while (scanf("%d", &n) ! EOF)8 {9 for (int i 0; i < n; i) 10 …

java正则表达式用法示例_Java正则表达式教程及示例

java正则表达式用法示例当我开始使用Java时&#xff0c;正则表达式对我来说是一场噩梦。 本教程旨在帮助您掌握Java正则表达式&#xff0c;并让我定期返回以刷新我的正则表达式学习。 什么是正则表达式&#xff1f; 正则表达式定义字符串的模式。 正则表达式可用于搜索&#…

查看ip

查看 http://httpbin.org/ip

Python中表示偶数_蒙特卡洛模拟(Python)深入教程

译者&#xff1a;大表哥、wiige来源&#xff1a;AI研习社什么是蒙特卡罗模拟&#xff1f;蒙特卡罗方法是一种使用随机数和概率来解决复杂问题的技术。蒙特卡罗模拟或概率模拟是一种技术&#xff0c;用于了解金融部门、项目管理、成本和其他预测机器学习模型中风险和不确定性的影…

琥珀项目:Java的未来揭晓

如果一切按计划进行&#xff08;我们正在研究Jigsaw项目&#xff09;&#xff0c;那么Java 9将在不到100天的时间内启动。 您可以在此处加入倒计时以发布它。 它将包含一长串新功能和升级功能&#xff0c;其中一些我们迫不及待想要看到实际应用。 但是&#xff0c;有些功能还没…

安装saltstack

https://www.cnblogs.com/agnewee/p/6487262.html 官方资料&#xff1a;https://docs.saltstack.com/en/latest/ref/configuration/index.html 官网资料&#xff1a;https://repo.saltstack.com/#rhel yum install https://repo.saltstack.com/py3/redhat/salt-py3-repo-latest…

python中for和while区别_Python学习第九篇——while和for的区别

1 pets [dog,cat,dog,goldfish,cat,rabbit,cat]2 print(pets)3 for pet inpets:4 print(pet)5 #------------------------------------------ 6 pets [dog,cat,dog,goldfish,cat,rabbit,cat]7 print(pets)8 while pet inpets:9 print(pet) 上述代码都想打印列表中的所有元素&…

java 11:数组作为函数参数,数组做为函数返回值

1 数组作为参数 我们可以将数组作为参数&#xff0c;传入到函数中&#xff0c;其实就像我们main函数中 public void main(String [] args){};就是用数组作为函数参数&#xff1b; 又如&#xff0c; [java] view plaincopypublic class ArrayPar { public static void p…

C++ 指针基本概念

Ⅰ.内存和地址 我们已经很熟悉一些基本的存储单位了,比如一个bit(位)用存储0或者1.也可以把几个bit合起来表示更大的数字,比如一个byte(字节)就包含了8个bit.这些都是很基础很简单的东西.然后我们可以把计算机的内存想象成一个字节数组,内存中的每一个地址表示一个字节. 每个字…

Java 7:使用NIO.2进行文件过滤–第2部分

大家好。 这是使用NIO.2系列进行文件过滤的第2部分。 对于那些尚未阅读第1部分的人 &#xff0c;这里有个回顾。 NIO.2是自Java 7起JDK中包含的用于I / O操作的新API。使用此新API&#xff0c;您可以执行与java.io相同的操作&#xff0c;以及许多出色的功能&#xff0c;例如&a…

机器人教育发展_得于人工智能发展,机器人教育低龄化越来越普及

近两年&#xff0c;各种看得到看不到的渠道都在推荐学机器人少儿编程&#xff0c;虽有利益使然&#xff0c;不过机器人少儿编程也确实算得上是通往世界名校大门的快速通道。相信很多家长也同样能感到&#xff0c;最近这股风刮得实在是太大&#xff0c;以至于周围的家长们都开始…

C#相对路径

1、 根目录 .\\ 或者直接给出文件名称&#xff0c;是找根目录的路径。 如&#xff1a;path "gs.mdb" 与 path ".\\gs.mdb"是一个意思。 2、 根目录的上级目录, 在C#中是指定到bin文件夹里面 ..\\ 应用程序的根目录的上两级 3、指定到根目录上面的三级目录…

java finalize方法的使用

《JAVA编程思想》&#xff1a; Java提供finalize()方法&#xff0c;垃圾回收器准备释放内存的时候&#xff0c;会先调用finalize()。 (1).对象不一定会被回收。 (2).垃圾回收不是析构函数。 (3).垃圾回收只与内存有关。 (4).垃圾回收和finalize()都是靠不住的&#xff0c;只要…

C++ 运算符优先级

优先级运算符名称或含义使用形式结合方向说明1[]数组下标数组名[常量表达式]左到右 ()圆括号&#xff08;表达式&#xff09;/函数名(形参表) .成员选择&#xff08;对象&#xff09;对象.成员名 ->成员选择&#xff08;指针&#xff09;对象指针->成员名 2-负号运算符-表…