String:字符串常量 。
StringBuffer 與 StringBuilder是字符緩沖變量。
StringBuffer 與 StringBuilder 中的方法和功能完全是等價(jià)的,只是StringBuffer中的方法大都采用了synchronized 關(guān)鍵字進(jìn)行修飾,因此是線程安全的,而StringBuilder沒(méi)有這個(gè)修飾,可以被認(rèn)為是線程不安全的。StringBuilder 是在JDK1.5才加入的。jdk的實(shí)現(xiàn)中StringBuffer與StringBuilder都繼承自AbstractStringBuilder。
1、String類(lèi)型的字符串對(duì)象是不可變的,一旦String對(duì)象創(chuàng)建后,包含在這個(gè)對(duì)象中的字符系列是不可以改變的,直到這個(gè)對(duì)象被銷(xiāo)毀。
2、StringBuilder和StringBuffer類(lèi)型的字符串是可變的,不同的是StringBuffer類(lèi)型的是線程安全的,而StringBuilder不是線程安全的
3、如果是多線程環(huán)境下涉及到共享變量的插入和刪除操作,StringBuffer則是首選。如果是非多線程操作并且有大量的字符串拼接,插入,刪除操作則StringBuilder是首選。畢竟String類(lèi)是通過(guò)創(chuàng)建臨時(shí)變量來(lái)實(shí)現(xiàn)字符串拼接的,耗內(nèi)存還效率不高,怎么說(shuō)StringBuilder是通過(guò)JNI方式實(shí)現(xiàn)終極操作的。
4、StringBuilder和StringBuffer的“可變”特性總結(jié)如下:
? ? (1)append,insert,delete方法最根本上都是調(diào)用System.arraycopy()這個(gè)方法來(lái)達(dá)到目的
? ? (2)substring(int, int)方法是通過(guò)重新new String(value, start, end - start)的方式來(lái)達(dá)到目的。因此,在執(zhí)行substring操作時(shí),StringBuilder和String基本上沒(méi)什么區(qū)別。
總的來(lái)說(shuō),三者在執(zhí)行速度方面的比較:StringBuilder > StringBuffer > String。
1.使用String類(lèi)的場(chǎng)景:在字符串不經(jīng)常變化的場(chǎng)景中可以使用String類(lèi),例如常量的聲明、少量的變量運(yùn)算。
2.使用StringBuffer類(lèi)的場(chǎng)景:在頻繁進(jìn)行字符串運(yùn)算(如拼接、替換、刪除等),并且運(yùn)行在多線程環(huán)境中,則可以考慮使用StringBuffer,例如XML解析、HTTP參數(shù)解析和封裝。
3.使用StringBuilder類(lèi)的場(chǎng)景:在頻繁進(jìn)行字符串運(yùn)算(如拼接、替換、和刪除等),并且運(yùn)行在單線程的環(huán)境中,則可以考慮使用StringBuilder,如SQL語(yǔ)句的拼裝、JSON封裝等。