簡要介紹
String:immutable類枣耀,類和成員變量都被聲明成final霉晕,由于不可變庭再,類似拼接、剪裁字符串等操作都會產(chǎn)生新的String對象牺堰。
StringBuffer:是為了解決拼接太多產(chǎn)生太多中間對象的問題拄轻,我們可以用append或者insert方法,把字符串添加到已有序列的末尾或者指定位置伟葫,線程安全恨搓,但是也帶來了額外的開銷,所以除非有線程安全的需要筏养,不推薦它斧抱。而是推薦StringBuilder。
StringBuilder:線程不安全渐溶,減小了開銷
字符串
String從原生上保證了線程安全辉浦,StringBuffer和StringBuilder底層是利用可以修改的數(shù)組(char,jdk9以后是byte)剛開始創(chuàng)建的長度是初始字符串長度加16,可以指定合適大小茎辐,從而避免多次擴容開銷宪郊。擴容會產(chǎn)生多重開銷,因為既要拋棄原有數(shù)組拖陆,又要創(chuàng)建新的數(shù)組弛槐,還要進行copy。java8會智能將String拼接字符串轉(zhuǎn)換成StringBuilder,java9提供了StringContractFactory
字符串緩存
創(chuàng)建一個字符串時依啰,首先檢查池中是否有值相同的字符串對象乎串,如果有則不需要創(chuàng)建直接從池中剛查找到的對象引用;如果沒有則新建字符串對象速警,返回對象引用叹誉,并且將新創(chuàng)建的對象放入池中艰争。但是,通過new方法創(chuàng)建的String對象是不檢查字符串池的桂对,而是直接在堆區(qū)或棧區(qū)創(chuàng)建一個新的對象甩卓,也不會把對象放入池中。
java6以后增加了intern()方法蕉斜,調(diào)用這個方法后逾柿,會從字符串常量池中尋找是否有這個字符串,沒有的話就是 將字符串添加進去宅此。但是緩存存到了永生代机错,空間有限,很可能導(dǎo)致OOM父腕。在后續(xù)版本中將緩存存放到了堆中弱匪。