郑州公司网站制作,中国网站排行榜,浙江省建设协会网站首页,深圳网站建设犀牛云stringbuffer当我处理旧代码并在StringBuffer实例上运行时#xff0c;通常将它们替换为StringBuilder实例。 尽管可以从此更改中获得性能优势#xff0c;但我经常在我所知不会对性能产生明显影响的地方进行更改。 我认为#xff0c;除了可能带来性能收益外#xff0c;还应出… 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运行StringBuffer和StringBuilder的实例数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.htmlstringbuffer