stringbuffer_StringBuffer的存在的含义

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

stringbuffer

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

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

相关文章

python find函数实现原理_非常干货:Python 探针实现原理

△点击上方“Python猫”关注 ,回复“1”领取电子书剧照 | 《棋魂》原文:https://segmentfault.com/a/1190000004889212大家好,我是猫哥。关于 Python 中探针的运用,我之前写过一篇《由浅入深:Python 中如何实现自动导入…

服务器系统js文件报错,js服务器文件

js服务器文件 内容精选换一换登录Windows操作系统的弹性云服务器时,需使用密码方式登录。因此,用户需先根据创建弹性云服务器时使用的密钥文件,获取该弹性云服务器初始安装时系统生成的管理员密码(Administrator帐户或Cloudbase-init设置的帐…

云盘存储 教学反思_wps轻松办公优秀教学设计范文

wps轻松办公优秀教学设计范文[教学目的与要求]1.学会登录“WPS轻办公”2.学会保存、打开“云文档”3.学会把文档以图片的方式分享到“微博”4.通过观察“WPS轻办公”,了解“WPS轻办公”,初步会用“我的圈子”功能。[教…

Adobe PhotoShop(PS) for Mac 快捷键/PS快捷键

文章目录综合类图层视图工具箱综合类 功能说明快捷键打开文件Command O创建文档Command N存储为Web格式Command Option Shift S自由变换Command T切换到最初状态Option Command Z重做Shift Command Z自定义快捷键Option Command Shift K首选项Command K色阶Comman…

spring启动执行_执行器的Spring启动和安全性事件

spring启动执行Spring Boot Actuator提供了审核功能,用于在启用了Spring Security的Spring Boot应用程序中发布和侦听与安全相关的事件。 默认事件是身份验证成功,身份验证失败和访问被拒绝,但是可以使用自定义事件进行扩展。 确保在项目中启…

系统运维包括哪些内容_智能养老系统包括哪些?养老管理系统内容详解

智慧养老成为养老产业新的发展热点,受到了社会各界的关注。智能养老系统利用先进的IT技术手段,开发面向居家养老、社区养老、机构养老的养老系统平台,提供实时、快捷、高效、物联化、智能化的养老服务,并将医疗服务、运营商、服务…

买了服务器之后如何操作系统,买了服务器之后如何操作系统

买了服务器之后如何操作系统 内容精选换一换如果您需要使用毕昇编译器,则需要先在服务端安装毕昇编译器。毕昇编译器基于开源LLVM开发,并进行了优化和改进,同时将flang作为默认的Fortran语言前端编译器,是针对鲲鹏平台的高性能编译…

敏捷中gwt含义_在GWT中序列化/反序列化Json

敏捷中gwt含义JSON和GWT 最近, GWT用户小组中进行了有趣的讨论 ,涉及在客户端对JSON进行序列化/反序列化的最佳实践。 这篇文章旨在突出其重点。 到目前为止,在GWT中有三种将对象转换为JSON并从客户端转换回JSON的方法: gwt-jack…

图片高亮处理编程_GMT语法高亮-智能提示-代码补全插件

GMT(Generic Mappint Tools)是地学界应用非常广泛的一款绘图兼数据处理的开源软件。其开发团队也是非常活跃,此软件还在不断的发展和更新中,变得越来越强大。目前已经有164个模块,而每一个模块又有很多命令参数。因为gmt是命令行软件&#xf…

超时空机战服务器配置信息错误,超时空机战熔炉篇FAQ教你如何合理的使用熔炉...

在超时空机战这款游戏中,有一处是叫做熔炉的地方,在其中可以分解物品得到其他的物品,可是怎么才能更好的利用熔炉分解物品达到资源合理利用的地步呢,接下来就和小编一起分析一下吧。1.什么是熔炉,熔炉在哪里可以找到?…

ASCII编码/Unicode编码

码位与字符的对照关系表(编码字符集) ASCII 码表,American Standard Code for Information Interchange,美国信息交换标准代码 Unicode 码表,万国码,几乎全球国家的字符都可以表示,也是用来表示…

tdd 单元测试_何时给定在单元测试和TDD中的重要性

tdd 单元测试最近,我一直在写与自动测试有关的更高级的概念(主要与Spock有关)。 但是,在进行测试培训时,我清楚地看到,通常对特定工具的知识并不是主要问题。 即使使用Spock,也可以编写肿且难以…

java 设计模式_Java设计模式的常见应用场景

一、Java I/O中的设计模式1、适配器模式适配器模式就是把一个类的接口变换成客户端所能接受的另一种接口,从而使两个接口不匹配而无法在一起工作的两个类能够在一起工作。通常被用在一个项目需要引用一些开源框架来一起工作时,这些框架的内部都有一些关于…

abaqus实例_使用Python在ABAQUS中创建XYData数据

这篇的正题是要讲一个愚蠢的小故事,无奈之举,恐成笑柄。但是从PythonAbaqus前后处理的角度讲,还是有点意义的,所以才敢拿出来献丑。三年航天器型号研制工作干下来,积累了不少陋习,但内心还是想努力克服的。…

常量和字面量的区别

字面量 是指由字母,数字等构成的字符串或者数值,它只能作为右值出现,所谓右值是指等号右边的值,如:int a123这里的a为左值,123为右值。 常量 常量和变量都属于变量,只不过常量是赋过值后不能…

java学习笔记_Java学习笔记day11

Map集合java.util.Map<k,v>集合 Map集合特点&#xff1a; 1.Map集合是一个双列集合&#xff0c;一个元素包含两个值(一个key&#xff0c;一个value) 2.Map集合中的元素&#xff0c;key和value的数据类型可以相同&#xff0c;也可以不同 3.Map集合中掉元素&#xff0c;key…

slice_Spring Boot Web Slice测试–示例

sliceSpring Boot 引入了一段时间的测试切片 &#xff0c;花了我一些时间来研究它并探索它的一些细微差别。 背景 使用此功能的主要原因是减少样板。 考虑一个看起来像这样的控制器&#xff0c;仅适用于使用Kotlin编写的各种控制器。 RestController RequestMapping("/u…

几点减几点怎么列算式_[股票一般几点可以买入]股票缩量怎么买 | 爱淘股吧

股票一般买入绝技——缩量调整突破买入股票缩量怎么买下面就来详细说说几个买入绝技&#xff1a;第一种&#xff1a;伴随着成交量的缩减。(2)在缩量调整到尾声之后&#xff0c;突然出现一根放量大阳线。(3)大阳线的出现伴随着成交量的放大。其下一个交易日如果股价继续放量上攻…

Java关键字和标识符

public class HelloWorld { // public、class 是关键字&#xff0c;HelloWorld是标识符public static void main(String[] args) { // public、static、void是关键字&#xff0c;main、String、args是标识符System.out.println("Hello,World!"); // System、out、pri…

python可视化水平双向箭头_python数据可视化第二弹

代码模板&#xff1a;最前面importpandas as pdpd.plotting.register_matplotlib_converters()importmatplotlib.pyplot as plt%matplotlib inlineimportseaborn as snsprint("Setup Complete")View Code一、折线图Line chartsplt.figure(figsize(14,6))#Add titlepl…