之前也是對(duì)這仨個(gè)一知半解姿鸿,所以也是看了好多的資料棍好,希望能夠給自己也給需要的人有幫助。
對(duì)String,StringBuilder,StringBuffer的有一個(gè)大體的了解
1.String Java的一個(gè)對(duì)象,值是不可變的,每次創(chuàng)建的時(shí)候都會(huì)生成新的String對(duì)象锡凝。至于為什么說(shuō)他不可變呢,其實(shí)在根本意義上:所謂的不可改變是指每次都創(chuàng)建了新的內(nèi)存垢啼,而原來(lái)的數(shù)據(jù)依然存儲(chǔ)在內(nèi)存中窜锯。
2.StringBuilder 是線程不安全的。線程不安全的
3.StringBuffer是線程安全的
好啦芭析,基于上面的初步了解锚扎,下面就具體分析一下哈。
一放刨、String
我們說(shuō)他不可變工秩,但是他就為什么不可變呢尸饺,其實(shí)我們通過(guò)String的源碼發(fā)現(xiàn)进统,他的類定義為final的,并且里面又封裝了final 修飾的char[]數(shù)組浪听。final修飾的變量一旦創(chuàng)建就不可以改變且子類不可以繼承螟碎,而且他無(wú)論是concat還是sub操作都是重新創(chuàng)建了一個(gè)新的對(duì)象。
通過(guò)String的“concat”源碼我們可以看出來(lái)的是每次連接都是創(chuàng)建了一個(gè)新的char[]數(shù)組
二迹栓、StringBuffer
StringBuffer,是一個(gè)線程安全掉分,且支持修改的一個(gè)對(duì)象,但是他為什么是線程安全的呢克伊,話不多說(shuō)上源碼酥郭。
果然任何事情都逃不過(guò)的真香定理祠乃,在StringBuffer的類中所有重現(xiàn)的方法我們發(fā)現(xiàn)都是存在“synchronized”修飾符的狰域,眾所周知這個(gè)關(guān)鍵字是在多線程訪問(wèn)的時(shí)候起到保護(hù)作用的栖博,(線程的問(wèn)題售睹,請(qǐng)看下回分解)沛膳,所以StringBuffer當(dāng)然是線程安全的啦扛施。
我們就那insert操作來(lái)看一下他的源碼吧
我們通過(guò)源碼發(fā)現(xiàn)StringBuffer漓穿,StringBuilder都會(huì)有append()枷餐、delete()、insert()這三個(gè)方法寝优,而String中沒(méi)有這些方法条舔,通過(guò)上述的StringBuffer的源碼我們可以分析得出結(jié)果,insert操作的時(shí)候都是調(diào)用了arraycopy方法將目標(biāo)數(shù)組復(fù)制到新的數(shù)組當(dāng)中去乏矾。
三孟抗、StringBuilder
通過(guò)源碼分析,我們發(fā)現(xiàn)StringBuilder是沒(méi)有Sychronized關(guān)鍵字的钻心,所以他是非線程安全的夸浅。
對(duì)于StringBuffer,StringBuilder,String運(yùn)行速度的分析
String<StringBuffer<Stringbuilder
String對(duì)象是不可改變的扔役,所以每次對(duì)String對(duì)象改變的時(shí)候帆喇,等同于創(chuàng)建了一個(gè)新的String對(duì)象,指針會(huì)重新指向這個(gè)對(duì)象亿胸,而垃圾內(nèi)存變多了以后坯钦,jvm的GC進(jìn)程就會(huì)重新進(jìn)行垃圾回收。
1.如果要操作少量的數(shù)據(jù)用 String 侈玄,這性能影響也不大婉刀。
2.如果單線程下操作大量數(shù)據(jù)用 StringBuilder,單線程不用考慮線程安全問(wèn)題序仙,且這個(gè)速度快突颊。
3.如果是多線程操作字符串緩沖區(qū)下操作大量數(shù)據(jù)用 StringBuffer,速度稍慢點(diǎn)潘悼,但安全保障律秃。