問題1. String的了解
問題2. String 為什么要設(shè)計成不可變的?
String 與 StringBuilder
String 類型 和 StringBuilder 類型的主要性能區(qū)別在于 String 是不可變的對象。
事實上,在對 String 類型進行“改變”時,實質(zhì)上等同于生成了一個新的 String 對象,然后將指針指向新的 String 對象。由于頻繁的生成對象會對系統(tǒng)性能產(chǎn)生影響,特別是當內(nèi)存中沒有引用指向的對象多了以后,JVM 的垃圾回收器就會開始工作,繼而會影響到程序的執(zhí)行效率。
所以,對于經(jīng)常改變內(nèi)容的字符串,最好不要聲明為 String 類型。但如果我們使用的是 StringBuilder 類,那么情形就不一樣了。因為,我們的每次修改都是針對 StringBuilder 對象本身的,而不會像對String操作那樣去生成新的對象并重新給變量引用賦值。所以,在一般情況下,推薦使用 StringBuilder ,特別是字符串對象經(jīng)常改變的情況下。
因此,在絕大部分情況下, 在效率方面:StringBuilder > String。
StringBuffer與StringBuilder
StringBuffer 始于 JDK 1.0,而 StringBuilder 始于 JDK 5.0;
此外,從 JDK 1.5 開始,對含有字符串變量 (非字符串字面值) 的連接操作(+),JVM 內(nèi)部是采用 StringBuilder 來實現(xiàn)的,而在這之前,這個操作是采用 StringBuffer 實現(xiàn)的。
JDK的實現(xiàn)中 StringBuffer 與 StringBuilder 都繼承自 AbstractStringBuilder。AbstractStringBuilder的實現(xiàn)原理為:AbstractStringBuilder 中采用一個 char數(shù)組 來保存需要append的字符串,char數(shù)組有一個初始大小,當append的字符串長度超過當前char數(shù)組容量時,則對char數(shù)組進行動態(tài)擴展,即重新申請一段更大的內(nèi)存空間,然后將當前char數(shù)組拷貝到新的位置,因為重新分配內(nèi)存并拷貝的開銷比較大,所以每次重新申請內(nèi)存空間都是采用申請大于當前需要的內(nèi)存空間的方式,這里是 2 倍。
StringBuffer 和 StringBuilder 都是可變的字符序列,但是二者最大的一個不同點是:StringBuffer 是線程安全的,而 StringBuilder 則不是。
StringBuilder 提供的API與StringBuffer的API是完全兼容的,即,StringBuffer 與 StringBuilder 中的方法和功能完全是等價的,但是后者一般要比前者快。因此,可以這么說,StringBuilder 的提出就是為了在單線程環(huán)境下替換 StringBuffer 。
在單線程環(huán)境下,優(yōu)先使用 StringBuilder。
應(yīng)用實例
字符串連接符的本質(zhì)
public class Test {
public static void main(String args[]) {
String s = null;
for(int i = 0; i < 100; i++) {
s += "a";
}
}
}
會被編譯器編譯為
public class Test {
public Test(){}
public static void main(String args[])
{
String s = null;
for (int i = 0; i < 100; i++)
s = (new StringBuilder(String.valueOf(s))).append("a").toString();
}
}
每做一次 字符串連接操作 “+” 就產(chǎn)生一個 StringBuilder 對象,然后 append 后就扔掉。下次循環(huán)再到達時,再重新 new 一個 StringBuilder 對象,然后 append 字符串,如此循環(huán)直至結(jié)束。事實上,如果我們直接采用 StringBuilder 對象進行 append 的話,我們可以節(jié)省 N - 1 次創(chuàng)建和銷毀對象的時間。所以,對于在循環(huán)中要進行字符串連接的應(yīng)用,一般都是用StringBulider對象來進行append操作。
引用鏈接:https://blog.csdn.net/justloveyou_/article/details/60983034