一. 介紹 String、StringBuffer、StringBuilder:??
前言:?String、StringBuffer、StringBuilder 均在java.lang包下;
String:?在Java中,String是一個(gè)特殊的引用類型,用于表示文本字符串。它提供了許多方法來(lái)操作和處理字符串,比如連接、截取、查找、替換等。String類內(nèi)部使用字符數(shù)組(char[])來(lái)存儲(chǔ)字符串的內(nèi)容,且value字段被final修飾,這意味著String對(duì)象一旦創(chuàng)建后,其值就不可改變。String對(duì)象的值存儲(chǔ)在常量池中,每次修改操作都會(huì)創(chuàng)建一個(gè)新的字符串對(duì)象,并且如果常量池中已經(jīng)存在相同內(nèi)容的字符串,就會(huì)直接引用該字符串而不創(chuàng)建新對(duì)象。
StringBuffer:Java中的一個(gè)可變字符串類,用于處理字符串。它可以被修改,因此適合在需要頻繁更改字符串內(nèi)容的情況下使用。StringBuffer提供了許多方法用于插入、刪除和修改字符串,并且支持線程安全操作。與String類不同,StringBuffer對(duì)象可以在已有的字符串基礎(chǔ)上進(jìn)行操作,且地址值不會(huì)改變;StringBuffer 類是可變的,它不會(huì)在常量池中創(chuàng)建新的常量。當(dāng)你使用 StringBuffer 修改一個(gè)字符串時(shí),它會(huì)在堆內(nèi)存中創(chuàng)建一個(gè)新的字符串對(duì)象,并且在需要的時(shí)候調(diào)整其容量。
StringBuilder:與StringBuffer類似,它允許在已有字符串的基礎(chǔ)上進(jìn)行修改、添加和刪除操作,而不需要?jiǎng)?chuàng)建新的字符串對(duì)象。通過(guò)使用StringBuilder,可以高效地進(jìn)行字符串拼接、插入、替換等操作,特別適用于頻繁修改字符串內(nèi)容的場(chǎng)景,每次修改只是對(duì)自身做出修改。StringBuilder具有較高的性能和效率,并且是線程不安全的,適用于單線程環(huán)境下的字符串處理。
?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-538086.html
二. 區(qū)別:
1. 不可變性:
- String類是不可變的,一旦創(chuàng)建就不能被修改。任何對(duì)字符串的操作都會(huì)創(chuàng)建一個(gè)新的字符串對(duì)象。
- StringBuffer和StringBuilder類是可變的,可以在原始字符串上進(jìn)行修改,無(wú)需創(chuàng)建新的對(duì)象。
2. 線程安全性:
- String類是線程安全的,因?yàn)樗姆椒ㄔ趦?nèi)部使用了同步機(jī)制,適用于多線程環(huán)境。
- StringBuffer類是線程安全的,所有的方法都使用了同步鎖,可以在多線程環(huán)境中使用。
- StringBuilder類是非線程安全的,它的方法沒(méi)有使用同步鎖,適用于單線程環(huán)境。
3. 性能:
- 由于String類的不可變性,每次進(jìn)行拼接、替換等操作時(shí)都會(huì)創(chuàng)建新的對(duì)象,對(duì)性能有一定影響。
- StringBuffer類是可變的,適用于頻繁操作字符串的情況,但是由于使用了線程安全同步機(jī)制,相對(duì)較慢。
- StringBuilder類是可變的,適用于單線程下頻繁操作字符串的情況,在性能上優(yōu)于StringBuffer。
綜上所述,如果你需要進(jìn)行頻繁的字符串拼接、替換等操作,并且在多線程環(huán)境下使用,應(yīng)該選擇StringBuffer類。如果在單線程環(huán)境下進(jìn)行字符串操作,可以選擇StringBuilder類以獲得更好的性能。而如果你不需要修改字符串,只是進(jìn)行簡(jiǎn)單的字符串操作,那么使用String類即可。
?
三. 代碼展示
不可變性區(qū)別展示:
public static void main(String[] args) { // String String str = "Hello"; System.out.println(str.hashCode()); String str1 = str + "word"; System.out.println(str1.hashCode()); // StringBuilder StringBuilder sb = new StringBuilder("Hello"); System.out.println(sb.hashCode()); StringBuilder sb1 = sb.append("word"); System.out.println(sb1.hashCode()); // StringBuffer StringBuffer sbf = new StringBuffer("Hello"); System.out.println(sbf.hashCode()); StringBuffer sbf1 = sbf.append("word"); System.out.println(sbf1.hashCode()); } 輸出結(jié)果: 69609650 -1093253444 23934342 23934342 22307196 22307196
可以看到String在改變字符串后,HashCode發(fā)生改變,而StringBuffer、StringBuilder 沒(méi)有變化。
?
四. 總結(jié)
- String:不可變的字符串,線程安全,適合在多線程環(huán)境下使用,適用于字符串內(nèi)容不經(jīng)常改變的情況,操作少量的數(shù)據(jù)。
- StringBuffer:可變的字符串,線程安全,適合在多線程環(huán)境下使用,適用于頻繁進(jìn)行字符串操作的情況。
- StringBuilder:可變的字符串,非線程安全,適合在單線程環(huán)境下使用,適用于頻繁進(jìn)行字符串操作的情況。
?
五. 擴(kuò)展
1. String 源碼中注釋
* Strings are constant; their values cannot be changed after they * are created. String buffers support mutable strings. * Because String objects are immutable they can be shared.
? ??*字符串是常量;它們的值在創(chuàng)建后不能更改,因?yàn)镾tring對(duì)象是不可變的,所以它們可以共享。
public final class String implements java.io.Serializable, Comparable<String>, CharSequence { /** The value is used for character storage. */ private final char value[]; /** Cache the hash code for the string */ private int hash; // Default to 0 }
?private final char value[];??底層是字符數(shù)組實(shí)現(xiàn),該值是使用final修飾,創(chuàng)建后不能改變。?
?
2. StringBuffer 源碼中注釋
* A thread-safe, mutable sequence of characters. * A string buffer is like a {@link String}, but can be modified. * The principal operations on a {@code StringBuffer} are the * {@code append} and {@code insert} methods, which are * overloaded so as to accept data of any type. * Whenever an operation occurs involving a source sequence (such as * appending or inserting from a source sequence), this class synchronizes * only on the string buffer performing the operation, not on the source.
* 線程安全的可變字符序列,字符串緩沖區(qū)類似于String,但是可以修改。
* 主要操作是通過(guò)append()、insert() 它們是重載的,以便接受任何類型的數(shù)據(jù)。
*?每當(dāng)涉及到源數(shù)據(jù)的操作發(fā)生改變時(shí),(例如從源序列追加或插入)此類進(jìn)行同步僅在執(zhí)行操作的字符串緩沖區(qū)上,而不是在源數(shù)據(jù)上。
@Override public synchronized StringBuffer append(Object obj) { toStringCache = null; super.append(String.valueOf(obj)); return this; } @Override public synchronized StringBuffer append(String str) { toStringCache = null; super.append(str); return this; }
StringBuffer 在插入或修改的時(shí)候 都會(huì)使用synchronized() 確保線程安全性。
?
3.?StringBuilder 源碼注釋
* A mutable sequence of characters. This class provides an API compatible * with {@code StringBuffer}, but with no guarantee of synchronization. * This class is designed for use as a drop-in replacement for * {@code StringBuffer} in places where the string buffer was being * used by a single thread (as is generally the case). Where possible, * it is recommended that this class be used in preference to * {@code StringBuffer} as it will be faster under most implementations. * Instances of {@code StringBuilder} are not safe for * use by multiple threads. If such synchronization is required then it is * recommended that {@link java.lang.StringBuffer} be used.
* 可變的字符串,此類提供與StringBuffer兼容的API,但不保證同步。這個(gè)類通常情況下用在字符串緩沖區(qū)被單個(gè)線程使用的地方,作為StringBuffer的替代品。建議優(yōu)先使用此類而不是StringBuffer,因?yàn)樵诖蠖鄶?shù)實(shí)現(xiàn)中它會(huì)更快。
* StringBuilder的實(shí)例對(duì)于多個(gè)線程使用是不安全的。如果需要同步,則建議使用StringBuffer
@Override public StringBuilder append(Object obj) { return append(String.valueOf(obj)); } @Override public StringBuilder append(String str) { super.append(str); return this; }
如果需要線程安全同步,建議使用StringBuffer類。
?
(?′?‵?) 完!?文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-538086.html
?
到了這里,關(guān)于String、StringBuffer、StringBuilder 的區(qū)別?的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!