字符串类StringBuffer和StringBuilder叫字符串缓冲区,请问哪里体现缓冲了?
学习是最好的投资!
由於Java的String都是以定長的方式儲存在記憶體中的,所以所有對String的增刪改操作,都需要建立新的記憶體並進行記憶體複製。
StringBuffer和StringBuilder的處理方式則與普通的String增刪改有所不同,它們是先申請內存,從而避免頻繁的內存申請。
例如我們分別拼接"a","b","c"。如果透過"a" + "b" + "c"這種方式,(在沒有優化的情況下)Java會先申請一個兩字節的內存,將"a"和"b"複製到這個內存上,之後再申請一個三位元組的內存,將"ab"和"c"複製到這塊內存中。 而透過StringBuffer或StringBuilder,他們會先申請一塊大記憶體(預設是十六位元組),當我們拼接時,只需要直接複製"a","b","c"到這塊記憶體上即可,不需要重複申請內存了。這裡先申請後所使用的形式就體現了緩衝區的概念。
不產生新物件。用String每次+都會產生新對象,當然較短時編譯器會進行編譯最佳化,而buffer這直接在原對像上append,不會產生新對象
這裡以StringBuilder為例,你看下原始碼,StringBuilder內部的儲存是採用char數組實作儲存的,append時,會將後面的字串拷貝到StringBuilder內部的char數組,如果內部緩衝不足,會用到System .arrayCopy來實現一個擴容機制,很有效率。就是這樣實現的緩衝。
而String d = "a" + "b" + "c"; 這種會產生多個字串對象,像上面回答的那樣,原因在於虛擬機器內部存在一個字串緩衝池。
普通的 "a" + "b" +"c"
是會產生 "ab" string 物件的
但是用那兩個類別只會產生最後的一個 "abc" 物件
由於Java的String都是以定長的方式儲存在記憶體中的,所以所有對String的增刪改操作,都需要建立新的記憶體並進行記憶體複製。
StringBuffer和StringBuilder的處理方式則與普通的String增刪改有所不同,它們是先申請內存,從而避免頻繁的內存申請。
例如我們分別拼接"a","b","c"。如果透過"a" + "b" + "c"這種方式,(在沒有優化的情況下)Java會先申請一個兩字節的內存,將"a"和"b"複製到這個內存上,之後再申請一個三位元組的內存,將"ab"和"c"複製到這塊內存中。
而透過StringBuffer或StringBuilder,他們會先申請一塊大記憶體(預設是十六位元組),當我們拼接時,只需要直接複製"a","b","c"到這塊記憶體上即可,不需要重複申請內存了。這裡先申請後所使用的形式就體現了緩衝區的概念。
不產生新物件。用String每次+都會產生新對象,當然較短時編譯器會進行編譯最佳化,而buffer這直接在原對像上append,不會產生新對象
這裡以StringBuilder為例,你看下原始碼,StringBuilder內部的儲存是採用char數組實作儲存的,append時,會將後面的字串拷貝到StringBuilder內部的char數組,如果內部緩衝不足,會用到System .arrayCopy來實現一個擴容機制,很有效率。就是這樣實現的緩衝。
而String d = "a" + "b" + "c"; 這種會產生多個字串對象,像上面回答的那樣,原因在於虛擬機器內部存在一個字串緩衝池。
普通的 "a" + "b" +"c"
是會產生 "ab" string 物件的
但是用那兩個類別只會產生最後的一個 "abc" 物件