java中Stringbuffer和String是有一定區(qū)別的,首先病附,String是被final修飾的,它的長度是不可變的域庇,就算調(diào)用String的concat方法覆积,那也是把字符串憑借起來重新創(chuàng)建一個(gè)對象,把拼接后的String賦值給新創(chuàng)建的對象宽档,而StringBuffer的長度是可變的,調(diào)用StringBuffer的append方法雌贱,來改變StrignBuffer長度偿短,并且馋没,相比較于StringBuffer,String一旦發(fā)生長度變化勾怒,是非常耗費(fèi)內(nèi)存的
String長度大小不可變
Stringbuffer和StringBuilder長度可變
StringBuffer線程安全StringBuilder線程不安全
StringBuilder速度快
java中的StringBuilder和StringBuffer使用的適用場景
最簡單的回答是声旺,StringBuffer基本沒有適用場景,如果遇見了腮猖,,坪创,姐赡,,
讓后補(bǔ)充一點(diǎn)项滑,關(guān)于線程安全,即使真的遇見了這種場景危喉,很不幸的事摘完,恐怕你仍有99.99%的情況下沒有必要選擇StringBuffer,因?yàn)镾tringBuffer的線程安全孝治,僅僅是保證jvm不拋出異常順利往下執(zhí)行而已,他可不保證邏輯正確和調(diào)用順序正確岂座,大多數(shù)時(shí)候,我們需要的不僅僅是線程安全而是鎖费什,
最后手素,為什么會有StringBuffer的存在瘩蚪,如果真的沒有價(jià)值稿黍,為什么jdk會提供這個(gè)類,答案太簡單了巡球!,因?yàn)樽钤缡菦]有StringBuilder的险胰,sun的人不知處于何種愚蠢的考慮矿筝,決定讓StringBuffer是線程安全的,然后大約10年后跋涣,人們終于意識到這是一個(gè)多么愚蠢的決定,意識到在這10年之中這個(gè)愚蠢的決定為java運(yùn)行速度慢這樣的流言貢獻(xiàn)了多大力量,于是在jdk5的時(shí)候细诸,終于決定提供一個(gè)非線程安全的StringBuffer的實(shí)現(xiàn),并命名為StringBuilder利赋,順便javac好像也是從這個(gè)版本開始把所有用+號連接的String運(yùn)算都隱式的發(fā)寫成StringBuilder猩系,也就是說,從jsk5寇甸,用+拼接字符串沒有任何性能損,嚴(yán)格來說沒有循環(huán)的情況下吟秩,單行用+拼接字符串是沒有任何損失的绽淘,但是如果有循環(huán)的話,編譯器是不能做到智能的替換的沪铭,所以拼接字符串還是老老實(shí)實(shí)用StringBuilder吧