String作為Java里面最重要的一個(gè)類(lèi),關(guān)于字符串構(gòu)造的類(lèi),有String、StringBuilder、StringBuffer。那么三者有什么區(qū)別呢,我們來(lái)了解一下。在Java中,關(guān)于構(gòu)造一個(gè)字符串有兩種方法:
- 直接賦值
- 通過(guò)new對(duì)象來(lái)構(gòu)造
我們來(lái)分析方法的內(nèi)部操作:
- 當(dāng)我們通過(guò)直接賦值的時(shí)候,我們會(huì)在常量池里面尋找有無(wú)這個(gè)值,如果有,那么直接將返回它的應(yīng)用,如果沒(méi)有那就直接創(chuàng)建一個(gè)放在常量池里;常量池會(huì)生成String對(duì)象,然后返回引用;
- 當(dāng)我們通過(guò)new來(lái)構(gòu)造對(duì)象的時(shí)候,也會(huì)去常量池去尋找,如果存在什么都不做,接著會(huì)在堆上建立一個(gè)String對(duì)象,然后返回對(duì)象的引用。

如何所示,當(dāng)我們執(zhí)行完這三條語(yǔ)句之后
String s1 = new String("Hi");
String s2 = "Hello";
String s3 = "Hello";
//Test
s2 == s3 //結(jié)果為T(mén)rue
s1 == s3 //返回False
但是當(dāng)我們需要修改s2的值的時(shí)候 : s3 = "Hi"的時(shí)候,發(fā)生了什么呢,是s3的值改變了么?

關(guān)于字符串構(gòu)造的三個(gè)類(lèi)
1.String
關(guān)于String字符串的構(gòu)造我們最常用的是:
String s = "I" + "am" + "tyf";
我們可以用 '+' 來(lái)構(gòu)造字符串,但是這個(gè)只適合比較短的字符串,效率比較低。
2. StringBuilder
StirngBuilder是Java.lang包的一個(gè)類(lèi)。它提供了StringBuffer提供的API,它是線程不安全的,所以在一些單線程的操作中,建議使用本類(lèi),因?yàn)檫@個(gè)在大多數(shù)實(shí)現(xiàn)中將會(huì)更快。每個(gè)字符串構(gòu)建器都有一個(gè)容量。只要字符串構(gòu)建器中包含的字符序列的長(zhǎng)度不超過(guò)容量,則不需要分配新的內(nèi)部緩沖區(qū)。如果內(nèi)部緩沖區(qū)溢出,則會(huì)自動(dòng)變大。常用方法:
//構(gòu)造方法
public StringBuilder(int capacity);//構(gòu)造一個(gè)沒(méi)有字符串的構(gòu)建器,參數(shù)指定初始容量
StringBuilder sb = new StringBuilder(); //構(gòu)建一個(gè)沒(méi)有字符的字符緩沖區(qū),初始容量為16
sb.append("fafaf"); //后面追加字符串
sb.insert(int offset, char[] str);
String z = "start"
StringBuilder sb = new StringBuilder(z);
sb.append("le"); //startle
sb.insert(4, "le); //starlet
例如,如果z引用當(dāng)前內(nèi)容為“ start ”的字符串構(gòu)建器對(duì)象,那么方法調(diào)用z.append("le")將導(dǎo)致字符串構(gòu)建器包含“ startle ”,而z.insert(4, "le")會(huì)將字符串構(gòu)建器更改為包含“ starlet ”。
3.StringBuffer
StirngBuffer是Java.lang包的一個(gè)類(lèi)。它是線程安全的,其在多線程操作中比較經(jīng)常使用。StringBuffer的主要StringBuffer是append和insert方法,它們被重載以便接受任何類(lèi)型的數(shù)據(jù)。每個(gè)都有效地將給定的數(shù)據(jù)轉(zhuǎn)換為字符串,然后將該字符串的字符附加或插入到字符串緩沖區(qū)。append方法總是在緩沖區(qū)的末尾添加這些字符;insert方法將insert添加到指定點(diǎn)。