StringBuilder是在原有的地址里去改變?cè)瓉?lái)的字符串嗎?
解析里面說(shuō)StringBuilder 不會(huì)額外創(chuàng)建一個(gè)對(duì)象,比如我先StringBuilder ?str1 = new?StringBuilder ("JAVA"); ? 再StringBuilder ?str2 ?=new?StringBuilder(str1 + 'A');
那么按照解析里說(shuō)的,不會(huì)額外產(chǎn)生臨時(shí)的變量,那是直接在str1的地址上修改成了JAVAA? ?我在eclipse里實(shí)驗(yàn)了一下,兩個(gè)字符串的地址也不一樣,也就是說(shuō),還是新開辟了一個(gè)地址,新產(chǎn)生了一個(gè)變量呀。有什么區(qū)別
2015-09-17
凡是new出來(lái)的都是對(duì)象。你new了2次,當(dāng)然會(huì)產(chǎn)生新的對(duì)象(開辟新的地址)。我們說(shuō)字符串具有不變性,指的是字符串一旦聲明不可改變(存儲(chǔ)在字符串常量池中)。例如:
實(shí)際上以上的代碼會(huì)在常量池中產(chǎn)生2個(gè)字符串:abc和abc123,其中前者因?yàn)闆]有任何指向會(huì)在適當(dāng)?shù)臅r(shí)候被gc回收;而StringBuilder將字符串存放在緩沖區(qū)(提到緩沖區(qū)我們很自然可以想到可以提高效率)。整個(gè)的字符串操作都是在緩沖區(qū)中進(jìn)行,最后調(diào)用toString()方法返回字符串(期間并沒有產(chǎn)生臨時(shí)字符串)