問題1. String的了解
問題2. String 為什么要設計成不可變的国裳?
String 與 StringBuilder
String 類型 和 StringBuilder 類型的主要性能區(qū)別在于 String 是不可變的對象。
事實上全跨,在對 String 類型進行“改變”時缝左,實質上等同于生成了一個新的 String 對象,然后將指針指向新的 String 對象浓若。由于頻繁的生成對象會對系統(tǒng)性能產生影響渺杉,特別是當內存中沒有引用指向的對象多了以后,JVM 的垃圾回收器就會開始工作挪钓,繼而會影響到程序的執(zhí)行效率是越。
所以,對于經常改變內容的字符串碌上,最好不要聲明為 String 類型倚评。但如果我們使用的是 StringBuilder 類,那么情形就不一樣了馏予。因為天梧,我們的每次修改都是針對 StringBuilder 對象本身的,而不會像對String操作那樣去生成新的對象并重新給變量引用賦值霞丧。所以呢岗,在一般情況下,推薦使用 StringBuilder 蛹尝,特別是字符串對象經常改變的情況下后豫。
因此,在絕大部分情況下箩言, 在效率方面:StringBuilder > String硬贯。
StringBuffer與StringBuilder
StringBuffer 始于 JDK 1.0,而 StringBuilder 始于 JDK 5.0陨收;
此外饭豹,從 JDK 1.5 開始,對含有字符串變量 (非字符串字面值) 的連接操作(+)务漩,JVM 內部是采用 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)擴展老赤,即重新申請一段更大的內存空間,然后將當前char數(shù)組拷貝到新的位置制市,因為重新分配內存并拷貝的開銷比較大抬旺,所以每次重新申請內存空間都是采用申請大于當前需要的內存空間的方式,這里是 2 倍祥楣。
StringBuffer 和 StringBuilder 都是可變的字符序列开财,但是二者最大的一個不同點是:StringBuffer 是線程安全的,而 StringBuilder 則不是误褪。
StringBuilder 提供的API與StringBuffer的API是完全兼容的责鳍,即,StringBuffer 與 StringBuilder 中的方法和功能完全是等價的兽间,但是后者一般要比前者快历葛。因此,可以這么說渡八,StringBuilder 的提出就是為了在單線程環(huán)境下替換 StringBuffer 啃洋。
在單線程環(huán)境下,優(yōu)先使用 StringBuilder屎鳍。
應用實例
字符串連接符的本質
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();
}
}
每做一次 字符串連接操作 “+” 就產生一個 StringBuilder 對象,然后 append 后就扔掉问裕。下次循環(huán)再到達時逮壁,再重新 new 一個 StringBuilder 對象,然后 append 字符串粮宛,如此循環(huán)直至結束窥淆。事實上,如果我們直接采用 StringBuilder 對象進行 append 的話巍杈,我們可以節(jié)省 N - 1 次創(chuàng)建和銷毀對象的時間忧饭。所以,對于在循環(huán)中要進行字符串連接的應用筷畦,一般都是用StringBulider對象來進行append操作词裤。
引用鏈接:https://blog.csdn.net/justloveyou_/article/details/60983034