字符串,是我們最常用的類型,每個用雙引號來表示的串都是一個字符串。Java中的字符串是一個預(yù)定義的類,跟C++ 一樣叫String,而不是Char數(shù)組。至于什么叫做類,暫時不做過多介紹,在之后的篇章中會有關(guān)于類的詳細介紹,在這里,只需要將類理解為一個模具,就像做月餅?zāi)菢?,想要什么外觀的月餅,就選用相應(yīng)的模具一壓,再往烤箱里一放,便能得到我們想要的月餅。用同一個模具所做出來的月餅基本是一樣的。當然,這個比喻并不十分恰當,不過就目前而已,它是有效的。聲明一個String類型的變量之后,這個變量便是String類型的一個實例,就好比模具做出來的月餅,而且能使用String類型的所有方法,也具有了String的所有屬性。
String這個類有一些基本的方法,如取子串,拼接,檢測是否相等 等一些常用的API。字符串處理將是我們經(jīng)常用到的,所以String的熟練使用將是不可或缺的。話不多說,我們直接上代碼實操。
新建項目的方法,我就不再多說了。代碼如下:
1 package pers.frank.test;
2
3 public class Test {
4 public static void main(String[] args){
5 String str = "我愛Java?。。?;
6 String str1 = str.substring(0,4);
7 System.out.println("str1:"+str1);
8
9 String str2 = str + "但我也愛C++。";
10 System.out.println("str2:"+str2);
11
12 String str3 = "我愛Java?。?!";
13 System.out.println(str3.equals(str));
14 System.out.println(str == str3);
15 System.out.println(str.length());
16 System.out.println(str.charAt(0));
17 System.out.println(str.charAt(2));
18 System.out.println(str.charAt(4));
19
20 String str4 = "我愛JavaScript!??!";
21 System.out.println(str4.substring(0,4) == str1);
22 }
23 }
第5行定義了一個字符串變量str,并給它初始化賦值。第六行,調(diào)用了String的substring方法,取了前四個字符,這個方法一共兩個參數(shù),第一個參數(shù)代表想要取的第一個字符的位置,從0開始,第二個字符代表第一個不想取的字符的位置。所以str.substring(0,4)即取字符串str的前四個字符。
第9行定義了str2,初始化的時候?qū)tr與字符串“但我也愛C++?!庇谩?”號拼接了起來,組成了新的字符串。
第12行定義了str3,同樣初始化賦值為“我愛Java?。。 ?,String的equals方法用于判斷兩個字符串的內(nèi)容是否相同,因為調(diào)用str3.equals(str)時,會返回true,注意,判斷兩個字符串是否相同時不要使用“==”,雖然在某些情況下,使用等號判斷可以順利執(zhí)行,但并非所有情況都如此。使用“==”號判斷時,判斷的是兩個字符串變量是否同時指向同一個字符串常量,而不是比較它們的內(nèi)容。String在這里更像是char*,字符串變量并沒有真正存儲字符串的內(nèi)容,而是存儲它們在內(nèi)存中的位置,就像戶口登記簿上寫的是你家的地址,而不是把你家搬到登記簿里面去。用等號判斷的時候,比較的是登記薄上記載的內(nèi)容是否相同,而用equals方法比較的是兩個地址指向的房子是否相同(可以不是同一棟房子)。在Java中,字符串常量都是被單獨存放在內(nèi)存空間的,在聲明str和str2的時候,會新建兩個字符串常量并存儲在內(nèi)存空間,然后把它們在內(nèi)存空間的地址賦值給這兩個變量。在聲明str3的時候,并沒有新建新的字符串常量,因為Java編譯器會讓字符串常量共享,所以實際上str3跟str指向的是同一個地址。這時使用等號來判斷兩者是否相等時可以得到正確的結(jié)果。但并不適用所有情況,如果再聲明一個字符串變量str4,賦值為“我愛JavaScript?。?!”,再調(diào)用substring方法跟str1用等號進行比較時,就不能得到正確的結(jié)果了。
第15行調(diào)用的是length方法,返回字符串的長度。
第16-18行調(diào)用charAt方法,返回的是第幾個位置上的字符。以下是運行結(jié)果:
因為java中的字符串都是Unicode字符,所以這里的字符概念跟某語言中的字符概念不太一樣,既然說到了這里,那就順便再詳細的說明一下相關(guān)的概念。
字符是抽象的最小文本單位。它沒有固定的形狀(可能是一個字形),而且沒有值。“A”是一個字符,“€”(德國、法國和許多其他歐洲國家通用貨幣的標志)也是一個字符。
字符集是字符的集合。例如,漢字字符是中國人最先發(fā)明的字符,在中文、日文、韓文和越南文的書寫中使用。
編碼字符集是一個字符集,它為每一個字符分配一個唯一數(shù)字。Unicode 標準的核心是一個編碼字符集,字母“A”的編碼為 004116 和字符“€”的編碼為20AC16.Unicode 標準始終使用十六進制數(shù)字,而且在書寫時在前面加上前綴“U+”,所以“A”的編碼書寫為“U+0041”。
代碼點是指可用于編碼字符集的數(shù)字。編碼字符集定義一個有效的代碼點范圍,但是并不一定將字符分配給所有這些代碼點。有效的 Unicode 代碼點范圍是 U+0000 至 U+10FFFF.Unicode 4.0 將字符分配給一百多萬個代碼點中的 96382 代碼點。
再細說可能就要說到具體的編碼上來了,由于不是本篇重點,所以還是不做過多介紹了,之后會有文章專門介紹。
關(guān)于String的方法很多,但常用的并不多,這里不全部介紹,想要了解的話可以在這里查看:http://www.runoob.com/java/java-string.html
暫時不需要全部記住,只要知道有那么個函數(shù),就可以實現(xiàn)那樣的功能就好了,以后的多碼代碼自然能夠記住了。
最后,再介紹一個叫做StringBuilder的類。這個類是干嘛用的呢?主要用于多字符串的拼接和處理。那你可能會問了,既然用“+”會把兩個字符串拼接起來,為啥還要這個類呢?事實上,每次聲明一個新字符串變量并賦上初值的時候,如果該字符串常量不存在,則會新建一個字符串常量并存儲,就像上面聲明str2的時候,會新建一個字符串對象“我愛Java?。。〉乙矏跜++?!倍皇呛唵蔚膶ⅰ暗乙矏跜++?!奔釉趕tr后面,而且如果有多次拼接,特別是在循環(huán)中使用的時候,這種方式無疑會浪費很多空間,我們需要的只是最后的字符串,而不是過程中間的產(chǎn)生的字符串,所以過程中生成的字符串對象并沒有存儲的必要,對程序而言便是存儲上的浪費,這個時候StringBuilder就產(chǎn)生了,可以調(diào)用它的append方法來拼接字符串,這樣可以節(jié)省很多不必要浪費的空間。
事實上,如果你有了解過C或者C++的話,對char[]應(yīng)該比較熟悉,StringBuilder內(nèi)部便是有一個自己維護的char數(shù)組,通過動態(tài)申請內(nèi)存方式進行拼接和處理。
StringBuilder常用的方法如下:
同樣不需要全部死記硬背,在之后的練習中多加使用便能熟練掌握。
至此,字符串的講解告一段落,歡迎大家繼續(xù)關(guān)注!
真正重要的東西,用眼睛是看不見的。