更新時(shí)間:2022-11-23 08:53:14 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽2589次
在Java中一共提供了三種類型可以表示字符串:String、StringBuilder、StringBuffer。
要談?wù)摓槭裁从腥齻€(gè)字符串類型,我們要先聊聊String的一些特性。
1.String是唯一一個(gè)設(shè)計(jì)了字面常量的引用數(shù)據(jù)類型
String str = "hello";
System.out.println("請(qǐng)輸入:");
回顧: 常量指的是不能修改變化的數(shù)據(jù)量,與它對(duì)應(yīng)的是變量。常量分兩種:
(1)符號(hào)常量;
(2)字面常量 “符號(hào)常量”是給常量起一個(gè)名字(符號(hào))
final int STUDENT_NUM = 50;
final double PI = 3.14;
final double PRICE = 3.14;
為什么要給常量起名字? 把業(yè)務(wù)含義帶入到數(shù)據(jù)量當(dāng)中; 便于修改,一改全改;
“字面常量”其實(shí)更常用,但也更容易被忽略。 當(dāng)我們?cè)诖a中出現(xiàn):5L,-19,3.4,3.14f,'A',"你的年齡是:"。 所以,注意--字面常量的特點(diǎn),特別是它的字面書(shū)寫(xiě)形式代表了數(shù)據(jù)類型。
言歸正傳,我們可以很容易的發(fā)現(xiàn)幾乎所有的字面常量都是基本數(shù)據(jù)類型,唯有String這個(gè)引用數(shù)據(jù)類型擁有一個(gè)字面常量的設(shè)計(jì)!
2.String擁有一個(gè)“字符串常量池”的設(shè)計(jì)
由于String的使用量非常大,所以對(duì)于String的字面常量,Java在設(shè)計(jì)的時(shí)候?qū)iT提供的了一個(gè)“常量池”來(lái)優(yōu)化。 “池”技術(shù),是你們現(xiàn)在第一次接觸,但以后會(huì)大量的出現(xiàn)。所謂池,就是預(yù)先在內(nèi)存當(dāng)中放置一系列的對(duì)象(字符串常量池就是放的字符串常量對(duì)象)。當(dāng)需要使用的時(shí)候,不用臨時(shí)去創(chuàng)建,而是從池當(dāng)中取一個(gè)來(lái)用就可以了。
JVM會(huì)在加載的時(shí)候,把加載到的類代碼當(dāng)中,所有書(shū)寫(xiě)的字符串常量對(duì)象,預(yù)存到一個(gè)專門的內(nèi)容空間---"字符串常量池"。然后開(kāi)始執(zhí)行指令語(yǔ)句,當(dāng)需要用到這個(gè)字符串常量對(duì)象的時(shí)候,就直接到常量池中去取。 演示
String s0 = "hello";
String s1 = "hello";
此時(shí),在加載期,就會(huì)在常量池當(dāng)中產(chǎn)生一個(gè)String類型的對(duì)象,里面的值是hello。然后運(yùn)行起來(lái)以后,s0和s1都會(huì)被賦值為這個(gè)對(duì)象的引用。所以,用"=="比較的時(shí)候,我們能得到true。
String s3 = new String("hello");
由于使用了new的語(yǔ)法,那么會(huì)在內(nèi)存的堆當(dāng)中產(chǎn)生一個(gè)全新的String對(duì)象,里面的字符值是hello。
String判斷非空,應(yīng)該判斷兩個(gè)條件。
其他的引用數(shù)據(jù)類型,只需要判斷是否“==”null;但是String有一種特殊性,它可能不為null,但是指向的String對(duì)象里面沒(méi)有存放字符數(shù)據(jù),是一個(gè)空串。 所以String判斷非空要用兩個(gè)條件
//如果輸入為空
if(str == null || str.equals("")){
}
//如果輸入不為空
if(str != null && !str.equals("")){
}
String對(duì)象的值一旦確定,不能改變。
String的這個(gè)特點(diǎn)其實(shí)是和String的源代碼設(shè)計(jì)有關(guān)系。我們可以把String看成是一個(gè)封裝的char[]。
public final class String{?
private final char[] value;
/*
還有其他屬性和一大堆的方法。
*/?
}
在這個(gè)設(shè)計(jì)當(dāng)中,我們可以看到字符串中的數(shù)據(jù)值是被作為屬性存在的,而且該屬性是私有的,所以外部不能直接操作,要利用String提供的方法來(lái)操作;同時(shí)該屬性是final的,所以它的值不能被修改。
到了JDK8之后,這個(gè)char[]被優(yōu)化成了byte[]。因?yàn)椴皇撬械淖址夹枰?個(gè)字節(jié)的空間,很多只需要1個(gè)字節(jié)空間就可以了。
這種內(nèi)容不可更改的特性又會(huì)照成一個(gè)新的問(wèn)題,當(dāng)我們大量的在程序中做字符串拼接或需要修改字符串內(nèi)容的動(dòng)作時(shí),就會(huì)產(chǎn)生很多字符串對(duì)象。 所以,Java又設(shè)計(jì)了新的字符串類型專門解決這個(gè)問(wèn)題。
StringBuilder 是在JDK5當(dāng)中,提出來(lái)的一個(gè)輔助String的字符串類型。它最大的特點(diǎn)是:內(nèi)容可變。 注意:StringBuilder不是String類型,是一種新的類型,所以如下代碼都是錯(cuò)的:
StringBuilder sb = "hello";
System.out.println(sb + "world");
由于StringBuilder是為了彌補(bǔ)String在內(nèi)容不可變上的缺點(diǎn),所以它提供的方法幾乎都是對(duì)內(nèi)容的修改方法。
1.append()方法 它的作用是在字符串的尾部添加內(nèi)容。為了能夠?qū)⒍喾N數(shù)據(jù)類型都方便的添加到尾部,提供了大量的重載方法。
2.delete()方法 它的作用是在字符串中刪掉指定從開(kāi)始下標(biāo)到結(jié)束下標(biāo)的內(nèi)容。
3.insert()方法 它的作用是在字符串中指定位置插入新的內(nèi)容。它的第一個(gè)參數(shù)就是插入位置的下標(biāo)。
4、replace()方法 它的作用是把字符串中指定位置的內(nèi)容替換為新的內(nèi)容。StringBuffer也是一個(gè)可變的字符串序列,它和StringBuilder的構(gòu)造、提供的行為完全一樣。唯一的區(qū)別就是:StringBuffer是線程安全的。
相關(guān)閱讀
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
有基礎(chǔ) 直達(dá)就業(yè)
業(yè)余時(shí)間 高薪轉(zhuǎn)行
工作1~3年,加薪神器
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問(wèn)老師會(huì)電話與您溝通安排學(xué)習(xí)