String作為Java里面最重要的一個類巾钉,關(guān)于字符串構(gòu)造的類翘狱,有String、StringBuilder睛琳、StringBuffer盒蟆。那么三者有什么區(qū)別呢,我們來了解一下师骗。在Java中,關(guān)于構(gòu)造一個字符串有兩種方法:
- 直接賦值
- 通過new對象來構(gòu)造
我們來分析方法的內(nèi)部操作:
- 當(dāng)我們通過直接賦值的時候讨惩,我們會在常量池里面尋找有無這個值障簿,如果有身笤,那么直接將返回它的應(yīng)用,如果沒有那就直接創(chuàng)建一個放在常量池里;常量池會生成String對象经伙,然后返回引用;
- 當(dāng)我們通過new來構(gòu)造對象的時候钳降,也會去常量池去尋找陷虎,如果存在什么都不做,接著會在堆上建立一個String對象魂角,然后返回對象的引用昵济。
![image.png](https://upload-images.jianshu.io/upload_images/26331282-9e413d8db38f267f.png&originHeight=354&originWidth=1264&originalType=binary&size=71869&status=done&style=none&taskId=uc03b38fa-264f-4bfb-b9d8-d61cfe8de6e&width=744?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
如何所示,當(dāng)我們執(zhí)行完這三條語句之后
String s1 = new String("Hi");
String s2 = "Hello";
String s3 = "Hello";
//Test
s2 == s3 //結(jié)果為True
s1 == s3 //返回False
但是當(dāng)我們需要修改s2的值的時候 : s3 = "Hi"
的時候野揪,發(fā)生了什么呢访忿,是s3的值改變了么?
![image.png](https://upload-images.jianshu.io/upload_images/26331282-304f6fb16d3e01b5.png&originHeight=324&originWidth=654&originalType=binary&size=31377&status=done&style=none&taskId=ud888c9c6-d287-484a-94ac-8a95793d8d8&width=422?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
關(guān)于字符串構(gòu)造的三個類
1.String
關(guān)于String字符串的構(gòu)造我們最常用的是:
String s = "I" + "am" + "tyf";
我們可以用 '+' 來構(gòu)造字符串憎茂,但是這個只適合比較短的字符串珍语,效率比較低。
2. StringBuilder
StirngBuilder是Java.lang包的一個類唇辨。它提供了StringBuffer提供的API廊酣,它是線程不安全的,所以在一些單線程的操作中赏枚,建議使用本類亡驰,因為這個在大多數(shù)實現(xiàn)中將會更快晓猛。每個字符串構(gòu)建器都有一個容量。只要字符串構(gòu)建器中包含的字符序列的長度不超過容量凡辱,則不需要分配新的內(nèi)部緩沖區(qū)戒职。如果內(nèi)部緩沖區(qū)溢出,則會自動變大透乾。常用方法:
//構(gòu)造方法
public StringBuilder(int capacity);//構(gòu)造一個沒有字符串的構(gòu)建器洪燥,參數(shù)指定初始容量
StringBuilder sb = new StringBuilder(); //構(gòu)建一個沒有字符的字符緩沖區(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)建器對象捧韵,那么方法調(diào)用z.append("le")將導(dǎo)致字符串構(gòu)建器包含“ startle ”,而z.insert(4, "le")會將字符串構(gòu)建器更改為包含“ starlet ”汉操。
3.StringBuffer
StirngBuffer是Java.lang包的一個類再来。它是線程安全的,其在多線程操作中比較經(jīng)常使用磷瘤。StringBuffer的主要StringBuffer是append和insert方法芒篷,它們被重載以便接受任何類型的數(shù)據(jù)。每個都有效地將給定的數(shù)據(jù)轉(zhuǎn)換為字符串采缚,然后將該字符串的字符附加或插入到字符串緩沖區(qū)针炉。append方法總是在緩沖區(qū)的末尾添加這些字符;insert方法將insert添加到指定點。