日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

StringBuffer的存在的含义

發(fā)布時(shí)間:2023/12/3 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 StringBuffer的存在的含义 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

當(dāng)我處理舊代碼并跨StringBuffer實(shí)例運(yùn)行時(shí),通常將它們替換為StringBuilder實(shí)例。 盡管可以從此更改中獲得性能優(yōu)勢,但我經(jīng)常在我知道對性能影響不大的地方對其進(jìn)行更改。 我認(rèn)為,除了可能帶來性能收益外,還應(yīng)出于各種原因進(jìn)行更改。 幾乎沒有理由不選擇StringBuilder不是StringBuffer (API期望是最常見的例外),并且代碼中存在StringBuffer誤導(dǎo)讀者,并為Java新手提供了一個(gè)不好的例子。

Andy Hunt和David Thomas 在 《 實(shí)用編程器:從旅居者到大師 》一書中討論了 “修復(fù)代碼中的小問題“破窗”的重要性”。 杰夫·阿特伍德(Jeff Atwood)在“破窗理論”一文中談到了這個(gè)主題,最近在“ 軟件腐爛,熵和破窗理論 ”一文中對此進(jìn)行了介紹,并且不要留下破窗 。 StringBuffer的存在暗含代碼中的陳舊性。 實(shí)際上,使用StringBuffer可能不是一個(gè)“破損的窗口”,但它是一個(gè)真正古老的,泄漏的單窗格窗口 ,應(yīng)將其替換為現(xiàn)代的,節(jié)能的雙窗格窗口 。

我發(fā)現(xiàn)了Peter Lawrey在最近的博客文章StringBuffer中,擺脫遺留代碼有多么困難,這是對代碼中仍然存在的StringBuffer其他含義的有趣理解。 Lawrey引用了StringBuffer類Javadoc文檔的最后一段,“從JDK 5版本開始,該類已經(jīng)添加了一個(gè)等效類,供單線程StringBuilder使用。 通常應(yīng)優(yōu)先使用StringBuilder類,因?yàn)樗С炙邢嗤牟僮?#xff0c;但它更快,因?yàn)樗粓?zhí)行同步。” Lawrey然后使用簡單的Java方法和jmap證明了StringBuffer實(shí)例仍在JDK附帶的類和庫中使用,甚至直到Java 8為止。

Lawrey指出,在引入“直接替換” StringBuilder十多年之后, StringBuffer在頻繁使用的Java代碼中的存在證明了“清理遺留代碼”有多么困難。 Lawrey的完整結(jié)論指出:“在啟動時(shí)使用StringBuffer并沒有多大區(qū)別,但是考慮到它具有眾所周知的替代性下降,并且仍在使用,即使在十多年后的新功能中也顯示出它有多難清理遺留代碼或改變思路,使人們使用最佳實(shí)踐庫。”

我決定在用Java 8 Update 121進(jìn)行編譯時(shí)以及在使用最新版本的OpenJDK 9進(jìn)行編譯時(shí)嘗試使用Lawrey最簡單的示例之一。我(略)將Lawrey的示例調(diào)整為下面所示的簡單“ 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選項(xiàng)(檢查中包括無法訪問的對象)的輸出,以顯示在簡單Java應(yīng)用程序中編譯并針對三種不同版本的Java( Java)運(yùn)行StringBuffer和StringBuilder的實(shí)例數(shù)8更新102 , Java 8更新121和OpenJDK 9.0 ea + 164 )。 jcmd的執(zhí)行是在PowerShell中執(zhí)行的,因此Select-String的用法與Linux中的grep相似。

盡管使用Java 8版本編譯和執(zhí)行的類的版本具有StringBuffer實(shí)例,但是使用Java 9編譯并針對Java 9執(zhí)行的版本僅具有StringBuilder實(shí)例。 看起來JDK-8041679 (“在核心庫類中用StringBuilder替換StringBuffer使用”)和JDK-8043342 (“在密碼子中用StringBuilder替換StringBuffer使用”) 的解析已達(dá)到預(yù)期的效果。

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

總結(jié)

以上是生活随笔為你收集整理的StringBuffer的存在的含义的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。