《JAVA語言程序設(shè)計教程》課件第5章_第1頁
《JAVA語言程序設(shè)計教程》課件第5章_第2頁
《JAVA語言程序設(shè)計教程》課件第5章_第3頁
《JAVA語言程序設(shè)計教程》課件第5章_第4頁
《JAVA語言程序設(shè)計教程》課件第5章_第5頁
已閱讀5頁,還剩42頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第5章字符串及其應(yīng)用5.1String類5.2StringBuilder類5.3StringBuffer類

5.1String類

字符串包含一個字符序列,在編程中字符串是一種常用的數(shù)據(jù)類型。在Java中,字符串是對象,而非基本數(shù)據(jù)類型。Java平臺中的字符串類是String,它表示一個UTF-16格式的字符串,其代碼單元是char。5.1.1創(chuàng)建字符串

最直接的創(chuàng)建字符串的方式為:

Stringgreeting=“Helloworld!”;

在這種情況下,“Helloworld!”是代碼中用雙引號包起來的一串文字。只要你在代碼中用雙引號將文字包起來,編譯器就會創(chuàng)建一個String類型的對象,對象里的內(nèi)容為字符串。在上例中,String對象里的內(nèi)容是Helloworld!。你也可以使用關(guān)鍵詞new調(diào)用構(gòu)造方法來創(chuàng)建String對象。類String有十幾個構(gòu)造方法,你可以使用不同格式的初始值來創(chuàng)建字符串對象,例如可以使用字符數(shù)組當作構(gòu)造方法的參數(shù):

char[]helloArray={‘h’,‘e’,‘l’,‘l’,‘o’,‘.’};

StringhelloString=newString(helloArray);

System.out.println(helloString);最后一行是打印字符串的內(nèi)容。

一個需要注意的事項是:一旦創(chuàng)建了一個String對象,其內(nèi)部的字符串內(nèi)容是不可更改的。類String的許多方法表面上好像是會修改字符串的內(nèi)容,其實上這些方法都是創(chuàng)建一個新的字符串,將結(jié)果放到這個新的字符串中,而不是去修改原來的字符串。5.1.2字符串的長度

在編程中,經(jīng)常需要獲取字符串的屬性。字符串的長度是一個常用的屬性,可以使用length()方法獲取。lenght()方法計算字符串對象中字符的數(shù)目,而非字節(jié)的數(shù)目。下面兩行代碼執(zhí)行后,變量len等于17。

Stringpalindrome=“DotsawIwasTod”;

intlen=palindrome.length();回文(palindrome)是一個對稱的單詞或者句子,不考慮大小寫和標點情況下,回文從前往后和從后往前的拼寫都是一樣的。下面這段簡短但效率不高的代碼可以將回文字符翻轉(zhuǎn),它主要調(diào)用chatAt(i)方法來實現(xiàn)。chatAt(i)可以返回字符串的第i個字符,字符的編號i從0開始。要實現(xiàn)字符串翻轉(zhuǎn),程序不得不將字符串先轉(zhuǎn)為字符數(shù)組(第一個for循環(huán)),然后將字符數(shù)組倒序排列(第二個for循環(huán)),最后再轉(zhuǎn)為String類型。String類還提供了一個方法getChars(),來將字符串或者字符串的一部分轉(zhuǎn)化為一個字符數(shù)組,因此上面程序中的第一個for循環(huán)可以使用下面這行代碼代替。

palindrome.getChars(0,len,tempCharArray,0);5.1.3字符串連接

String類中的concat()方法可以將兩個字符串連接起來,形成一個字符串,用法如下:

string1.concat(string2);

這行代碼返回一個新的字符串,字符串的內(nèi)容為string1和string2構(gòu)成的新字符串,string2附加在string1后面。你也可以對字符串常量使用concat()方法,具體用法如下:

“Mynameis”.concat(“Rumplestiltskin”);

更常用的連接字符串的方法是使用?+?操作符,用法如下:

“Hello,”+“world”+“!”

其結(jié)果為:

“Hello,world!”

在打印字符串的時候,使用+操作符非常方便,例如:

Stringstring1=“sawIwas”;

System.out.println(“Dot”+string1+“Tod”);

將打印出:

DotsawIwasTod除了String對象,也可以使用+操作符連接不同類型的對象,但前提條件是這些對象要有toString()方法將之轉(zhuǎn)為String類型。

需要注意的是,Java不允許在源代碼文件中將一個字符串常量寫成多行。如果需要一個非常長的字符串,為了美觀和易讀,可以將之在多行中寫成多個字符串,然后使用+操作符將這些字符串連接為一個字符串。實現(xiàn)代碼如下所示。

Stringquote=

"Nowisthetimeforallgood"+

"mentocometotheaidoftheircountry.";5.1.4字符串比較

如果要比較兩個字符串的內(nèi)容是否相同,不可以用==符號來判斷,而應(yīng)該用String類的方法equals()來判斷。例如:

Strings1=newString(“HelloWorld!”);

Strings2=newString(“HelloWorld!”);

Strings3=newString("Helloworld!");那么s1.equals(s2)返回的值是true,s1.equals(s3)的返回值是false,因為s3中的w字母是小寫,與s1不同。如果希望忽略大小寫的區(qū)別對字符串內(nèi)容進行比較,那么可以是使用equalsIgnoreCase()方法。s1.equalsIgnoreCase(s3)的返回值是true。另外,如果希望將字符串里的所有字符轉(zhuǎn)為大寫,可以使用toLowerCase()方法;如果希望將字符串里的所有字符轉(zhuǎn)為小寫,可以使用toUpperCase()方法。需要注意,表達式s1==s2是符合Java語法的,但該表達式的值是false,而不是true。因為s1和s2是引用,表達式s1==s2是判斷兩個引用是否相等,而不是比較字符串的內(nèi)容是否相同。

字符串比較的另外一個方法是compareTo(),該方法按照字典順序比較兩個字符串,比較是基于字符的Unicode值。如果按照字典順序,String對象位于參數(shù)字符串之前,則比較結(jié)果為一個負整數(shù);如果String對象位于參數(shù)字符串之后,則比較結(jié)果是一個正整數(shù);如果兩個字符串的內(nèi)容相同,則結(jié)果為0。只有當compareTo()的結(jié)果為0時,equals()的結(jié)果才為true。5.1.5常量字符串的引用

在Java中,常量字符串也是一個對象,因此可以將一個常量字符串賦值給一個變量。在代碼中,如果有兩處地方出現(xiàn)相同的常量字符串,則在編譯時,編譯器會只生成一份數(shù)據(jù)實體。下面的代碼可以幫助理解常量字符串及其引用。程序運行結(jié)果如圖5.2所示。圖5.2對常量字符串的引用進行比較的結(jié)果

如前面所解釋,s1字符串與s2字符串都是常量字符串,且內(nèi)容相同,編譯時分配同一數(shù)據(jù)實體,故s1與s2具有相同的引用,因此表達式s1==s2的值為true。

s3字符串由兩個常量字符串使用連接操作構(gòu)成。在編譯時,編譯器會將二者編譯為一個常量字符串,也具有與s1和s2相同的數(shù)據(jù)實體,因此表達式s1==s3的值也為true。

s4與s3不同,雖然也是由兩個常量字符串連接而成,但是字符串的連接操作發(fā)生在程序運行時,而不是編譯時,因此具有與其它三個變量不同的數(shù)據(jù)實體。這樣,表達式s1==s4的值為false。5.1.6字符串的查詢

如果希望了解字符串中是否含有另一個字符串,可以使用contains()方法。如果String對象包含參數(shù)字符串,則返回true,否則返回false。

如果希望判斷字符串是否以某個特定的字符串開始,也即字符串的前綴是否為某特定字符串,可使用startsWith()方法。與之相對應(yīng),如果判斷字符串的后綴,可使用endsWith()方法。前面介紹的三種查詢方法只能判斷參數(shù)字符串是否存在,不能提供參數(shù)字符串在字符串對象中的位置信息。如果希望獲取參數(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類中也包含一些對字符串的“操作”方法,不過這些“操作”不是真正對字符串進行操作,因為String類型的字符串是不可以修改的。這些“操作”是創(chuàng)建新的字符串來存儲結(jié)果。如果提取字符串的一部分,可以使用substring()方法。Stringsubstring(intbeginIndex)提取從beginIndex開始直到字符串結(jié)尾的所有字符。Stringsubstring(intbeginIndex,intendIndex)提取從beginIndex到endIndex-1處的字符,返回的字符不包含第endIndex個字符。

“Helloworld”.substring(6); //返回world

"Helloworld".substring(6,9); //返回wor

String類也提供了字符串替換的方法replace(),該方法返回一個新的字符串,新字符串是對原字符串中的某個字符進行替換得到的。

“thewarofbaronets”.replace(‘r’,‘y’); //返回thewayofbayonets

“Hello”.replace(‘q’,‘x’); //原字符串無q字符,不替換,返回Hello

String類中的另一個實用函數(shù)是trim()。在程序設(shè)計中,有時要處理用戶輸入的字符串數(shù)據(jù)(如用戶名)。用戶輸入的這些數(shù)據(jù)有時會在字符開始或結(jié)束處出現(xiàn)無意義的空格,trim()方法可以將這些空格去掉。5.1.8將字符串轉(zhuǎn)為數(shù)值

在Java中,表達數(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”); //返回浮點數(shù)3.1415926

如果將String類型的字符串轉(zhuǎn)為某個表達數(shù)值的引用類型,可以使用Byte、Integer、Short、Long、Float和Double中的valueOf()方法。示例代碼如下。

Floatf=Float.valueOf(“3.1415926”); //返回浮點數(shù)對象,其內(nèi)容為浮點數(shù)3.1415926

5.1.9將數(shù)值轉(zhuǎn)為字符串

如果需要以字符串的方式操作數(shù)值,則需要先將數(shù)值轉(zhuǎn)為字符串。轉(zhuǎn)換方式有幾種,其中一種很簡單的方式為:

inti=1024;

Strings1=“”+i;//此處將i與一個空字符串進行連接操作

也可以如下:

Strings2=String.valueOf(i);每個Number類的子類都有一個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(),該方法返回一個String對象,而不是返回PrintStream對象。

例如使用printf()方法,可以打印格式化的字符串:

System.out.printf("Thevalueofthefloat"+

"variableis%f,while"+

"thevalueofthe"+

"integervariableis%d,"+

"andthestringis%s",

floatVar,intVar,stringVar);如果你想獲取這個格式化的字符串,而不是僅僅打印出來,上述代碼可以寫成如下形式:

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)建的字符串對象是不可修改的,字符串對象一旦創(chuàng)建,字符串的長度和內(nèi)容不能再發(fā)生任何變化。雖然String類提供了replace()以及substring()等方法來實現(xiàn)對字符串的“修改”操作,但是如果對字符串的修改比較頻繁,建議使用StringBuilder類。

StringBuilder類是Java5中新增的類,在字符串的修改操作方面,StringBuilder類要比String類高效。但需要注意的是將StringBuilder實例應(yīng)用于多個線程是不安全的。如果需要多個線程間的數(shù)據(jù)同步,建議使用StringBuffer類,StringBuffer類將在下一節(jié)介紹。5.2.1長度和容量

如同String類,StringBuilder類也有一個length()方法,該方法能返回當前字符串對象中字符的數(shù)目。

與String類不同的是,StringBuilder類還有一個capacity()方法。這個方法返回的是StringBuilder對象中字符的容量,容量值應(yīng)該大于或等于(一般是大于)字符串的長度。當字符串變長,容量不夠的時候,StringBuilder會自動擴充容量。5.2.2構(gòu)造方法

目前StringBuilder有四種構(gòu)造方法:

(1)?StringBuilder():無參數(shù)的構(gòu)造方法,創(chuàng)建一個容量為16的空字符串。

(2)?StringBuilder(CharSequencecs):創(chuàng)建一個字符串,內(nèi)容與參數(shù)cs相同,并在尾部增加16個空元素。

(3)?StringBuilder(intinitCapacity):創(chuàng)建一個空字符串,初始容量由參數(shù)initCapacity指定。

(4)?StringBuilder(Strings):創(chuàng)建一個字符串,內(nèi)容與參數(shù)s相同,并在尾部增加16個空元素。

例如下面的代碼:

//創(chuàng)建容量為16的對象

StringBuildersb=newStringBuilder();

//在字符串最后添加一個有5個字符的字符串

sb.append(“Hello”);

上面這段代碼創(chuàng)建了容量為16,長度為5的StringBuilder對象,該對象的示意圖如圖5.3所示。

StringBuilder類中的setLength(intnewLength)方法可以設(shè)置字符序列的長度,如果newLength小于當前字符序列,則后面的字符會被截掉。如果newLength大于當前字符序列,那么字符序列后面會添加一些空字符。

另外一個方法ensureCapacity(intminCapacity)能夠保障容量至少有minCapacity大小。

StringBuilder類中的許多操作方法(如append()、insert()或setLength())能夠增加字符序列的長度,這會使得StringBuilder中的字符序列長度大于最初的容量。當這種情況發(fā)生時,StringBuilder的容量會自動增加,不會發(fā)生容量不足的問題。5.2.3StringBuilder常用方法

String中沒有,而StringBuilder具有的非常關(guān)鍵的方法是append()和insert()。這兩個方法被重載,可以接收各種不同類型的參數(shù)。這些不同類型的參數(shù)都可以被轉(zhuǎn)為字符序列,并添加到StringBuilder的字符序列中。append()方法是往字符序列的尾部添加,而insert()可以添加到任意位置。

一些常用的方法列于表5.1中。例5-1中的例程實現(xiàn)了回文的逆序。如果使用StringBuil

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論