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