




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第5章字符串及其應(yīng)用5.1String類5.2StringBuilder類5.3StringBuffer類
5.1String類
字符串包含一個(gè)字符序列,在編程中字符串是一種常用的數(shù)據(jù)類型。在Java中,字符串是對(duì)象,而非基本數(shù)據(jù)類型。Java平臺(tái)中的字符串類是String,它表示一個(gè)UTF-16格式的字符串,其代碼單元是char。5.1.1創(chuàng)建字符串
最直接的創(chuàng)建字符串的方式為:
Stringgreeting=“Helloworld!”;
在這種情況下,“Helloworld!”是代碼中用雙引號(hào)包起來的一串文字。只要你在代碼中用雙引號(hào)將文字包起來,編譯器就會(huì)創(chuàng)建一個(gè)String類型的對(duì)象,對(duì)象里的內(nèi)容為字符串。在上例中,String對(duì)象里的內(nèi)容是Helloworld!。你也可以使用關(guān)鍵詞new調(diào)用構(gòu)造方法來創(chuàng)建String對(duì)象。類String有十幾個(gè)構(gòu)造方法,你可以使用不同格式的初始值來創(chuàng)建字符串對(duì)象,例如可以使用字符數(shù)組當(dāng)作構(gòu)造方法的參數(shù):
char[]helloArray={‘h’,‘e’,‘l’,‘l’,‘o’,‘.’};
StringhelloString=newString(helloArray);
System.out.println(helloString);最后一行是打印字符串的內(nèi)容。
一個(gè)需要注意的事項(xiàng)是:一旦創(chuàng)建了一個(gè)String對(duì)象,其內(nèi)部的字符串內(nèi)容是不可更改的。類String的許多方法表面上好像是會(huì)修改字符串的內(nèi)容,其實(shí)上這些方法都是創(chuàng)建一個(gè)新的字符串,將結(jié)果放到這個(gè)新的字符串中,而不是去修改原來的字符串。5.1.2字符串的長度
在編程中,經(jīng)常需要獲取字符串的屬性。字符串的長度是一個(gè)常用的屬性,可以使用length()方法獲取。lenght()方法計(jì)算字符串對(duì)象中字符的數(shù)目,而非字節(jié)的數(shù)目。下面兩行代碼執(zhí)行后,變量len等于17。
Stringpalindrome=“DotsawIwasTod”;
intlen=palindrome.length();回文(palindrome)是一個(gè)對(duì)稱的單詞或者句子,不考慮大小寫和標(biāo)點(diǎn)情況下,回文從前往后和從后往前的拼寫都是一樣的。下面這段簡短但效率不高的代碼可以將回文字符翻轉(zhuǎn),它主要調(diào)用chatAt(i)方法來實(shí)現(xiàn)。chatAt(i)可以返回字符串的第i個(gè)字符,字符的編號(hào)i從0開始。要實(shí)現(xiàn)字符串翻轉(zhuǎn),程序不得不將字符串先轉(zhuǎn)為字符數(shù)組(第一個(gè)for循環(huán)),然后將字符數(shù)組倒序排列(第二個(gè)for循環(huán)),最后再轉(zhuǎn)為String類型。String類還提供了一個(gè)方法getChars(),來將字符串或者字符串的一部分轉(zhuǎn)化為一個(gè)字符數(shù)組,因此上面程序中的第一個(gè)for循環(huán)可以使用下面這行代碼代替。
palindrome.getChars(0,len,tempCharArray,0);5.1.3字符串連接
String類中的concat()方法可以將兩個(gè)字符串連接起來,形成一個(gè)字符串,用法如下:
string1.concat(string2);
這行代碼返回一個(gè)新的字符串,字符串的內(nèi)容為string1和string2構(gòu)成的新字符串,string2附加在string1后面。你也可以對(duì)字符串常量使用concat()方法,具體用法如下:
“Mynameis”.concat(“Rumplestiltskin”);
更常用的連接字符串的方法是使用?+?操作符,用法如下:
“Hello,”+“world”+“!”
其結(jié)果為:
“Hello,world!”
在打印字符串的時(shí)候,使用+操作符非常方便,例如:
Stringstring1=“sawIwas”;
System.out.println(“Dot”+string1+“Tod”);
將打印出:
DotsawIwasTod除了String對(duì)象,也可以使用+操作符連接不同類型的對(duì)象,但前提條件是這些對(duì)象要有toString()方法將之轉(zhuǎn)為String類型。
需要注意的是,Java不允許在源代碼文件中將一個(gè)字符串常量寫成多行。如果需要一個(gè)非常長的字符串,為了美觀和易讀,可以將之在多行中寫成多個(gè)字符串,然后使用+操作符將這些字符串連接為一個(gè)字符串。實(shí)現(xiàn)代碼如下所示。
Stringquote=
"Nowisthetimeforallgood"+
"mentocometotheaidoftheircountry.";5.1.4字符串比較
如果要比較兩個(gè)字符串的內(nèi)容是否相同,不可以用==符號(hào)來判斷,而應(yīng)該用String類的方法equals()來判斷。例如:
Strings1=newString(“HelloWorld!”);
Strings2=newString(“HelloWorld!”);
Strings3=newString("Helloworld!");那么s1.equals(s2)返回的值是true,s1.equals(s3)的返回值是false,因?yàn)閟3中的w字母是小寫,與s1不同。如果希望忽略大小寫的區(qū)別對(duì)字符串內(nèi)容進(jìn)行比較,那么可以是使用equalsIgnoreCase()方法。s1.equalsIgnoreCase(s3)的返回值是true。另外,如果希望將字符串里的所有字符轉(zhuǎn)為大寫,可以使用toLowerCase()方法;如果希望將字符串里的所有字符轉(zhuǎn)為小寫,可以使用toUpperCase()方法。需要注意,表達(dá)式s1==s2是符合Java語法的,但該表達(dá)式的值是false,而不是true。因?yàn)閟1和s2是引用,表達(dá)式s1==s2是判斷兩個(gè)引用是否相等,而不是比較字符串的內(nèi)容是否相同。
字符串比較的另外一個(gè)方法是compareTo(),該方法按照字典順序比較兩個(gè)字符串,比較是基于字符的Unicode值。如果按照字典順序,String對(duì)象位于參數(shù)字符串之前,則比較結(jié)果為一個(gè)負(fù)整數(shù);如果String對(duì)象位于參數(shù)字符串之后,則比較結(jié)果是一個(gè)正整數(shù);如果兩個(gè)字符串的內(nèi)容相同,則結(jié)果為0。只有當(dāng)compareTo()的結(jié)果為0時(shí),equals()的結(jié)果才為true。5.1.5常量字符串的引用
在Java中,常量字符串也是一個(gè)對(duì)象,因此可以將一個(gè)常量字符串賦值給一個(gè)變量。在代碼中,如果有兩處地方出現(xiàn)相同的常量字符串,則在編譯時(shí),編譯器會(huì)只生成一份數(shù)據(jù)實(shí)體。下面的代碼可以幫助理解常量字符串及其引用。程序運(yùn)行結(jié)果如圖5.2所示。圖5.2對(duì)常量字符串的引用進(jìn)行比較的結(jié)果
如前面所解釋,s1字符串與s2字符串都是常量字符串,且內(nèi)容相同,編譯時(shí)分配同一數(shù)據(jù)實(shí)體,故s1與s2具有相同的引用,因此表達(dá)式s1==s2的值為true。
s3字符串由兩個(gè)常量字符串使用連接操作構(gòu)成。在編譯時(shí),編譯器會(huì)將二者編譯為一個(gè)常量字符串,也具有與s1和s2相同的數(shù)據(jù)實(shí)體,因此表達(dá)式s1==s3的值也為true。
s4與s3不同,雖然也是由兩個(gè)常量字符串連接而成,但是字符串的連接操作發(fā)生在程序運(yùn)行時(shí),而不是編譯時(shí),因此具有與其它三個(gè)變量不同的數(shù)據(jù)實(shí)體。這樣,表達(dá)式s1==s4的值為false。5.1.6字符串的查詢
如果希望了解字符串中是否含有另一個(gè)字符串,可以使用contains()方法。如果String對(duì)象包含參數(shù)字符串,則返回true,否則返回false。
如果希望判斷字符串是否以某個(gè)特定的字符串開始,也即字符串的前綴是否為某特定字符串,可使用startsWith()方法。與之相對(duì)應(yīng),如果判斷字符串的后綴,可使用endsWith()方法。前面介紹的三種查詢方法只能判斷參數(shù)字符串是否存在,不能提供參數(shù)字符串在字符串對(duì)象中的位置信息。如果希望獲取參數(shù)字符串的位置,可以使用indexOf()方法。如果找到字符串,則返回首次出現(xiàn)的位置;如果沒有找到,返回?-1。關(guān)于字符串查詢方法的使用如下:
Strings=“Helloworld!”;
booleanb1=s.contains(“Hello”); //b1的值為true
booleanb2=s.startsWith(“Hello”); //b2的值為true
booleanb3=s.endsWith(“Hello”); //b3的值為false
inti=s.indexOf("world"); //i的值為65.1.7字符串的操作
String類中也包含一些對(duì)字符串的“操作”方法,不過這些“操作”不是真正對(duì)字符串進(jìn)行操作,因?yàn)镾tring類型的字符串是不可以修改的。這些“操作”是創(chuàng)建新的字符串來存儲(chǔ)結(jié)果。如果提取字符串的一部分,可以使用substring()方法。Stringsubstring(intbeginIndex)提取從beginIndex開始直到字符串結(jié)尾的所有字符。Stringsubstring(intbeginIndex,intendIndex)提取從beginIndex到endIndex-1處的字符,返回的字符不包含第endIndex個(gè)字符。
“Helloworld”.substring(6); //返回world
"Helloworld".substring(6,9); //返回wor
String類也提供了字符串替換的方法replace(),該方法返回一個(gè)新的字符串,新字符串是對(duì)原字符串中的某個(gè)字符進(jìn)行替換得到的。
“thewarofbaronets”.replace(‘r’,‘y’); //返回thewayofbayonets
“Hello”.replace(‘q’,‘x’); //原字符串無q字符,不替換,返回Hello
String類中的另一個(gè)實(shí)用函數(shù)是trim()。在程序設(shè)計(jì)中,有時(shí)要處理用戶輸入的字符串?dāng)?shù)據(jù)(如用戶名)。用戶輸入的這些數(shù)據(jù)有時(shí)會(huì)在字符開始或結(jié)束處出現(xiàn)無意義的空格,trim()方法可以將這些空格去掉。5.1.8將字符串轉(zhuǎn)為數(shù)值
在Java中,表達(dá)數(shù)值的數(shù)據(jù)類型有兩類:一類是基本數(shù)據(jù)類型byte、int、short、long、float和double;另一類是引用類型,為Number的子類,包括Byte、Integer、Short、Long、Float和Double等。如果將String類型的字符串轉(zhuǎn)為基本數(shù)據(jù)類型,可以使用Byte、Integer、Short、Long、Float和Double中的parseByte()、parseInteger()、parseShort()、parseLong()、parseFloat()和parseDouble()方法。示例代碼如下。
floatf=Float.parseFloat(“3.1415926”); //返回浮點(diǎn)數(shù)3.1415926
如果將String類型的字符串轉(zhuǎn)為某個(gè)表達(dá)數(shù)值的引用類型,可以使用Byte、Integer、Short、Long、Float和Double中的valueOf()方法。示例代碼如下。
Floatf=Float.valueOf(“3.1415926”); //返回浮點(diǎn)數(shù)對(duì)象,其內(nèi)容為浮點(diǎn)數(shù)3.1415926
5.1.9將數(shù)值轉(zhuǎn)為字符串
如果需要以字符串的方式操作數(shù)值,則需要先將數(shù)值轉(zhuǎn)為字符串。轉(zhuǎn)換方式有幾種,其中一種很簡單的方式為:
inti=1024;
Strings1=“”+i;//此處將i與一個(gè)空字符串進(jìn)行連接操作
也可以如下:
Strings2=String.valueOf(i);每個(gè)Number類的子類都有一個(gè)toString()方法,該方法是類方法,可以將表示數(shù)值的基本數(shù)據(jù)類型轉(zhuǎn)為字符串,用法
如下:
inti=1024;
doubled=3.1415926;
Strings3=Integer.toString(i);
Strings4=Double.toString(d);5.1.10創(chuàng)建格式化字符串
如果希望打印格式化的數(shù)值,可使用System.out.printf()方法。String類也有類似的方法format(),該方法返回一個(gè)String對(duì)象,而不是返回PrintStream對(duì)象。
例如使用printf()方法,可以打印格式化的字符串:
System.out.printf("Thevalueofthefloat"+
"variableis%f,while"+
"thevalueofthe"+
"integervariableis%d,"+
"andthestringis%s",
floatVar,intVar,stringVar);如果你想獲取這個(gè)格式化的字符串,而不是僅僅打印出來,上述代碼可以寫成如下形式:
Stringfs;
fs=String.format(“Thevalueofthefloat”+
“variableis%f,while”+
“thevalueofthe”+
“integervariableis%d,”+
“andthestringis%s”,
floatVar,intVar,stringVar);
System.out.println(fs);
5.2StringBuilder類
通過上一節(jié)的介紹,我們可以得知String類創(chuàng)建的字符串對(duì)象是不可修改的,字符串對(duì)象一旦創(chuàng)建,字符串的長度和內(nèi)容不能再發(fā)生任何變化。雖然String類提供了replace()以及substring()等方法來實(shí)現(xiàn)對(duì)字符串的“修改”操作,但是如果對(duì)字符串的修改比較頻繁,建議使用StringBuilder類。
StringBuilder類是Java5中新增的類,在字符串的修改操作方面,StringBuilder類要比String類高效。但需要注意的是將StringBuilder實(shí)例應(yīng)用于多個(gè)線程是不安全的。如果需要多個(gè)線程間的數(shù)據(jù)同步,建議使用StringBuffer類,StringBuffer類將在下一節(jié)介紹。5.2.1長度和容量
如同String類,StringBuilder類也有一個(gè)length()方法,該方法能返回當(dāng)前字符串對(duì)象中字符的數(shù)目。
與String類不同的是,StringBuilder類還有一個(gè)capacity()方法。這個(gè)方法返回的是StringBuilder對(duì)象中字符的容量,容量值應(yīng)該大于或等于(一般是大于)字符串的長度。當(dāng)字符串變長,容量不夠的時(shí)候,StringBuilder會(huì)自動(dòng)擴(kuò)充容量。5.2.2構(gòu)造方法
目前StringBuilder有四種構(gòu)造方法:
(1)?StringBuilder():無參數(shù)的構(gòu)造方法,創(chuàng)建一個(gè)容量為16的空字符串。
(2)?StringBuilder(CharSequencecs):創(chuàng)建一個(gè)字符串,內(nèi)容與參數(shù)cs相同,并在尾部增加16個(gè)空元素。
(3)?StringBuilder(intinitCapacity):創(chuàng)建一個(gè)空字符串,初始容量由參數(shù)initCapacity指定。
(4)?StringBuilder(Strings):創(chuàng)建一個(gè)字符串,內(nèi)容與參數(shù)s相同,并在尾部增加16個(gè)空元素。
例如下面的代碼:
//創(chuàng)建容量為16的對(duì)象
StringBuildersb=newStringBuilder();
//在字符串最后添加一個(gè)有5個(gè)字符的字符串
sb.append(“Hello”);
上面這段代碼創(chuàng)建了容量為16,長度為5的StringBuilder對(duì)象,該對(duì)象的示意圖如圖5.3所示。
StringBuilder類中的setLength(intnewLength)方法可以設(shè)置字符序列的長度,如果newLength小于當(dāng)前字符序列,則后面的字符會(huì)被截掉。如果newLength大于當(dāng)前字符序列,那么字符序列后面會(huì)添加一些空字符。
另外一個(gè)方法ensureCapacity(intminCapacity)能夠保障容量至少有minCapacity大小。
StringBuilder類中的許多操作方法(如append()、insert()或setLength())能夠增加字符序列的長度,這會(huì)使得StringBuilder中的字符序列長度大于最初的容量。當(dāng)這種情況發(fā)生時(shí),StringBuilder的容量會(huì)自動(dòng)增加,不會(huì)發(fā)生容量不足的問題。5.2.3StringBuilder常用方法
String中沒有,而StringBuilder具有的非常關(guān)鍵的方法是append()和insert()。這兩個(gè)方法被重載,可以接收各種不同類型的參數(shù)。這些不同類型的參數(shù)都可以被轉(zhuǎn)為字符序列,并添加到StringBuilder的字符序列中。append()方法是往字符序列的尾部添加,而insert()可以添加到任意位置。
一些常用的方法列于表5.1中。例5-1中的例程實(shí)現(xiàn)了回文的逆序。如果使用StringBuil
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 安全管理合格證的考核試題及答案解析
- 通信維護(hù)員外包合同協(xié)議
- 轉(zhuǎn)運(yùn)隔離協(xié)議書范本
- 通信戰(zhàn)略合作合同協(xié)議
- 中級(jí)會(huì)計(jì)復(fù)習(xí)資料分類及使用技巧試題及答案
- 教你解鎖一級(jí)建造師試題及答案
- 通訊經(jīng)營部購銷合同協(xié)議
- 無人機(jī)操作手冊重要性試題及答案
- 有序準(zhǔn)備2024年高級(jí)會(huì)計(jì)試題及答案
- 2025年入團(tuán)考試全面分析試題及答案
- 2025屆安徽省池州市普通高中高三教學(xué)質(zhì)量統(tǒng)一監(jiān)測政治試卷含、答案
- 《汽車博覽會(huì)》名師課件2
- 學(xué)校食堂“三同三公開”制度實(shí)施方案
- 海南2025年海南熱帶海洋學(xué)院招聘113人筆試歷年參考題庫附帶答案詳解
- 2024-2025學(xué)年人教版(2024)七年級(jí)英語下冊Unit 6 rain or shine Section A 2a-2e 教案
- 比較文學(xué)形象學(xué)-狄澤林克
- 商業(yè)地產(chǎn)運(yùn)營管理規(guī)章制度
- 2018中國癡呆與認(rèn)知障礙診治指南(九)中國記憶障礙門診建立規(guī)范(全文版)
- 脫髓鞘病淋巴瘤
- 小紅書種草營銷師(初級(jí))認(rèn)證考試真題試題庫(含答案)
- 醫(yī)療健康管理大數(shù)據(jù)平臺(tái)
評(píng)論
0/150
提交評(píng)論