## Java編程那些事兒75——String類使用
陳躍峰
出自:[http://blog.csdn.net/mailbomb](http://blog.csdn.net/mailbomb)
### 9.5.3 String和StringBuffer
String和StringBuffer類都是代表字符串,也就是任意多個字符組成的序列。程序需要存儲的大量文字一般都使用字符串進行代表。在這兩個類中,包含了大部分關于字符串操作的方法,在實際操作字符串時,可以首先查閱這兩個類中的方法。
String和StringBuffer雖然都代表字符串,但是由于兩個類內部實現的區別,所以一般把String看成不可變字符串,而把StringBuffer看成可變字符串,對于String的每次改變(例如字符串連接等)都會生成一個新的字符串,比較浪費內存,而StringBuffer每次都改變自身,不生成新的對象,比較節約內存。
下面就詳細介紹一下String和StringBuffer的實際使用。
#### 9.5.3.1 String類
1、String對象的初始化
由于String對象特別常用,所以在對String對象進行初始化時,Java提供了一種簡化的特殊語法,格式如下:
??????????????????????????? String s = “abc”;
??????????????????????????? s = “Java語言”;
其實按照面向對象的標準語法,其格式應該為:
??????????????????????????? String s = new String(“abc”);
??????????????????????????? s = new String(“Java語言”);
只是按照面向對象的標準語法,在內存使用上存在比較大的浪費。例如String s = new String(“abc”);實際上創建了兩個String對象,一個是”abc”對象,存儲在常量空間中,一個是使用new關鍵字為對象s申請的空間。
其它的構造方法的參數,可以參看String類的API文檔。
2、字符串的常見操作
a、charAt方法
該方法的作用是按照索引值(規定字符串中第一個字符的索引值是0,第二個字符的索引值是1,依次類推),獲得字符串中的指定字符。例如:
???????? String s = “abc”;
???????? char c = s.chatAt(1);
則變量c的值是’b’。
b、compareTo方法
該方法的作用是比較兩個字符串的大小,比較的原理是依次比較每個字符的字符編碼。首先比較兩個字符串的第一個字符,如果第一個字符串的字符編碼大于第二個的字符串的字符編碼,則返回大于0的值,如果小于則返回小于0的值,如果相等則比較后續的字符,如果兩個字符串中的字符編碼完全相同則返回0。
例如:
???????????????????????????????????? String s = “abc”;
???????????????????????????????????? String s1 = “abd”;
???????????????????????????????????? int value = s.compareTo(s1);
則value的值是小于0的值,即-1。
在String類中還存在一個類似的方法compareToIgnoreCase,這個方法是忽略字符的大小寫進行比較,比較的規則和compareTo一樣。例如:
???????????????????????????????????? String s = “aBc”;
???????????????????????????????????? String s1 = “ABC”;
???????????????????????????????????? int value = s. compareToIgnoreCase (s1);
則value的值是0,即兩個字符串相等。
c、concat方法
該方法的作用是進行字符串的連接,將兩個字符串連接以后形成一個新的字符串。例如:
???????????????????????????????????? String s = “abc”;
???????????????????????????????????? String s1 = “def”;
???????????????????????????????????? String s2 = s.concat(s1);
則連接以后生成的新字符串s2的值是”abcdef”,而字符串s和s1的值不發生改變。如果需要連接多個字符串,可以使用如下方法:
???????? ??????????????????????????? String s = “abc”;
???????????????????????????????????? String s1 = “def”;
???????????????????????????????????? String s2 = “1234”;
String s3 = s.concat(s1).concat(s2);
則生成的新字符串s3的值為”abcdef1234”。
其實在實際使用時,語法上提供了一種更簡單的形式,就是使用“+”進行字符串的連接。例如:
String s = “abc” + “1234”;
則字符串s的值是”abc1234”,這樣書寫更加簡單直觀。
而且使用“+”進行連接,不僅可以連接字符串,也可以連接其他類型。但是要求進行連接時至少有一個參與連接的內容是字符串類型。而且“+”匹配的順序是從左向右,如果兩邊連接的內容都是基本數字類型則按照加法運算,如果參與連接的內容有一個是字符串才按照字符串進行連接。
例如:
int a = 10;
String s = “123” + a + 5;
則連接以后字符串s的值是“123105”,計算的過程為首先連接字符串”123”和變量a的值,生成字符串”12310”,然后使用該字符串再和數字5進行連接生成最終的結果。
而如下代碼:
~~~
???????? int a = 10;
???????? String s = a + 5 + “123”;
~~~
則連接以后字符串s的值是”15123”,計算的過程為首先計算a和數字5,由于都是數字型則進行加法運算或者數字值15,然后再使用數字值15和字符串”123”進行連接獲得最終的結果。
而下面的連接代碼是錯誤的:
~~~
???????? int a = 12;
???????? String s = a + 5 + ‘s’;
~~~
因為參與連接的沒有一個字符串,則計算出來的結果是數字值,在賦值時無法將一個數字值賦值給字符串s。
d、endsWith方法
該方法的作用是判斷字符串是否以某個字符串結尾,如果以對應的字符串結尾,則返回true。
例如:
~~~
???????? String s = “student.doc”;
???????? boolean b = s.endsWith(“doc”);
~~~
則變量b的值是true。
e、equals方法
該方法的作用是判斷兩個字符串對象的內容是否相同。如果相同則返回true,否則返回false。例如:
~~~
???????? String s = “abc”;
???????? String s1 = new String(“abc”);
???????? boolean b = s.equals(s1);
~~~
而使用“==”比較的是兩個對象在內存中存儲的地址是否一樣。例如上面的代碼中,如果判斷:
boolean b = (s == s1);
則變量b的值是false,因為s對象對應的地址是”abc”的地址,而s1使用new關鍵字申請新的內存,所以內存地址和s的”abc”的地址不一樣,所以獲得的值是false。
在String類中存在一個類似的方法equalsIgnoreCase,該方法的作用是忽略大小寫比較兩個字符串的內容是否相同。例如:
~~~
???????? String s = “abc”;
???????? String s1 =”ABC”;
???????? boolean b = s. equalsIgnoreCase (s1);
~~~
則變量b的值是true。
f、getBytes方法
該方法的作用是將字符串轉換為對應的byte數組,從而便于數據的存儲和傳輸。例如:
String s = “計算機”;
byte[] b = s.getBytes();?? //使用本機默認的字符串轉換為byte數組
byte[] b = s.getBytes(“gb2312”); //使用gb2312字符集轉換為byte數組
在實際轉換時,一定要注意字符集的問題,否則中文在轉換時將會出現問題。
g、indexOf方法
該方法的作用是查找特定字符或字符串在當前字符串中的起始位置,如果不存在則返回-1。例如:
~~~
???????????????????????????????????? String s = “abcded”;
???????????????????????????????????? int index = s.indexOf(‘d’);
???????????????????????????????????? int index1 = s.indexOf(‘h’);
~~~
則返回字符d在字符串s中第一次出現的位置,數值為3。由于字符h在字符串s中不存在,則index1的值是-1。
當然,也可以從特定位置以后查找對應的字符,例如:
int index = s.indexOf(‘d’,4);
則查找字符串s中從索引值4(包括4)以后的字符中第一個出現的字符d,則index的值是5。
由于indexOf是重載的,也可以查找特定字符串在當前字符串中出現的起始位置,使用方式和查找字符的方式一樣。
另外一個類似的方法是lastIndexOf方法,其作用是從字符串的末尾開始向前查找第一次出現的規定的字符或字符串,例如:
??????????????????????????? ???????? String s = “abcded”;
???????????????????????????????????? int index = s. lastIndexOf(‘d’);
則index的值是5。
h、length方法
該方法的作用是返回字符串的長度,也就是返回字符串中字符的個數。中文字符也是一個字符。例如:
~~~
???????? String s = “abc”;
???????? String s1 = “Java語言”;
???????? int len = s.length();
???????? int len1 = s1.length();
~~~
則變量len的值是3,變量len1的值是6。
i、replace方法
該方法的作用是替換字符串中所有指定的字符,然后生成一個新的字符串。經過該方法調用以后,原來的字符串不發生改變。例如:
~~~
???????? String s = “abcat”;
???????? String s1 = s.replace(‘a’,’1’);
~~~
該代碼的作用是將字符串s中所有的字符a替換成字符1,生成的新字符串s1的值是”1bc1t”,而字符串s的內容不發生改變。
如果需要將字符串中某個指定的字符串替換為其它字符串,則可以使用replaceAll方法,例如:
~~~
???????? String s = “abatbac”;
???????? String s1 = s.replaceAll(“ba”,”12”);
~~~
該代碼的作用是將字符串s中所有的字符串”ab”替換為”12”,生成新的字符串”a12t12c”,而字符串s的內容也不發生改變。
如果只需要替換第一個出現的指定字符串時,可以使用replaceFirst方法,例如:
~~~
???????? String s = “abatbac”;
???????? String s1 = s. replaceFirst (“ba”,”12”);
~~~
該代碼的作用是只將字符串s中第一次出現的字符串”ab”替換為字符串”12”,則字符串s1的值是”a12tbac”,字符串s的內容也不發生改變。
j、split方法
該方法的作用是以特定的字符串作為間隔,拆分當前字符串的內容,一般拆分以后會獲得一個字符串數組。例如:
~~~
???????? String s = “ab,12,df”;
???????? String s1[] = s.split(“,”);
~~~
該代碼的作用是以字符串”,”作為間隔,拆分字符串s,從而得到拆分以后的字符串數字s1,其內容為:{“ab”,”12”,”df”}。
該方法是解析字符串的基礎方法。
如果字符串中在內部存在和間隔字符串相同的內容時將拆除空字符串,尾部的空字符串會被忽略掉。例如:
~~~
???????? String s = “abbcbtbb”;
???????? String s1[] = s.split(“b”);
~~~
則拆分出的結果字符串數組s1的內容為:{“a”,””,”c”,”t”}。拆分出的中間的空字符串的數量等于中間間隔字符串的數量減一個。例如:
~~~
???????? String s = “abbbcbtbbb”;
???????? String s1[] = s.split(“b”);
~~~
則拆分出的結果是:{“a”,””,””,”c”,”t”}。最后的空字符串不論有多少個,都會被忽略。
如果需要限定拆分以后的字符串數量,則可以使用另外一個split方法,例如:
~~~
???????? String s = “abcbtb1”;
???????? String s1[] = s.split(“b”,2);
~~~
該代碼的作用是將字符串s最多拆分成包含2個字符串數組。則結果為:{“a”,”cbtb1”}。
???????? 如果第二個參數為負數,則拆分出盡可能多的字符串,包括尾部的空字符串也將被保留。
k、startsWith方法
該方法的作用和endsWith方法類似,只是該方法是判斷字符串是否以某個字符串作為開始。例如:
~~~
???????? String s = “TestGame”;
???????? boolean b = s.startsWith(“Test”);
~~~
則變量b的值是true。
l、substring方法
該方法的作用是取字符串中的“子串”,所謂“子串”即字符串中的一部分。例如“23”是字符串“123”的子串。
字符串“123”的子串一共有6個:”1”、”2”、”3”、”12”、”23”、”123”。而”32”不是字符串”123”的子串。
例如:
~~~
???????? String s = “Test”;
???????? String s1 = s.substring(2);
~~~
則該代碼的作用是取字符串s中索引值為2(包括)以后的所有字符作為子串,則字符串s1的值是”st”。
如果數字的值和字符串的長度相同,則返回空字符串。例如:
~~~
???????? String s = “Test”;
???????? String s1 = s.substring(4);
~~~
則字符串s1的值是””。
如果需要取字符串內部的一部分,則可以使用帶2個參數的substring方法,例如:
~~~
???????? String s = “TestString”;
???????? String s1 = s.substring(2,5);
~~~
則該代碼的作用是取字符串s中從索引值2(包括)開始,到索引值5(不包括)的部分作為子串,則字符串s1的值是”stS”。
下面是一個簡單的應用代碼,該代碼的作用是輸出任意一個字符串的所有子串。代碼如下:
~~~
???????????????????????????????????? String s = “子串示例”;
???????????????????????????????????? int len = s.length();? //獲得字符串長度
???????????????????????????????????? for(int begin = 0;begin < len – 1;begin++){? //起始索引值
?????????????????????????????????????????????? for(int end = begin + 1;end <= len;end++){? //結束索引值
??????????????????????????????????????????????????????? System.out.println(s.substring(begin,end));
?????????????????????????????????????????????? }
???????????????????????????????????? }
~~~
在該代碼中,循環變量begin代表需要獲得的子串的起始索引值,其變化的區間從第一個字符的索引值0到倒數第二個字符串的索引值len -2,而end代表需要獲得的子串的結束索引值,其變化的區間從起始索引值的后續一個到字符串長度。通過循環的嵌套,可以遍歷字符串中的所有子串。
m、toCharArray方法
該方法的作用和getBytes方法類似,即將字符串轉換為對應的char數組。例如:
~~~
???????? String s = “abc”;
???????? char[] c = s.toCharArray();
~~~
則字符數組c的值為:{‘a’,’b’,’c’}。
n、toLowerCase方法
該方法的作用是將字符串中所有大寫字符都轉換為小寫。例如:
~~~
???????????????????????????????????? String s = “AbC123”;
???????????????????????????????????? String s1 = s.toLowerCase();
~~~
??????????????????????????? 則字符串s1的值是”abc123”,而字符串s的值不變。
類似的方法是toUpperCase,該方法的作用是將字符串中的小寫字符轉換為對應的大寫字符。例如:
~~~
???????? ??????????????????????????? String s = “AbC123”;
???????????????????????????????????? String s1 = s. toUpperCase ();
~~~
則字符串s1的值是”ABC123”,而字符串s的值也不變。
o、trim方法
該方法的作用是去掉字符串開始和結尾的所有空格,然后形成一個新的字符串。該方法不去掉字符串中間的空格。例如:
~~~
???????????????????????????????????? String s = “?? abc? abc? 123? “;
???????????????????????????????????? String s1 = s.trim();
??????????????????????????? 則字符串s1的值為:” abc? abc? 123”。字符串s的值不變。
?????????????????? p、valueOf方法
~~~
該方法的作用是將其它類型的數據轉換為字符串類型。需要注意的是,基本數據和字符串對象之間不能使用以前的強制類型轉換的語法進行轉換。
另外,由于該方法是static方法,所以不用創建String類型的對象即可。例如:
~~~
???????? int n = 10;
???????? String s = String.valueOf(n);
~~~
則字符串s的值是”10”。雖然對于程序員來說,沒有發生什么變化,但是對于程序來說,數據的類型卻發生了變化。
介紹一個簡單的應用,判斷一個自然數是幾位數字的邏輯代碼如下:
~~~
???????? int n = 12345;
???????? String s = String.valueOf(n);
???????? int len = s.length();
~~~
則這里字符串的長度len,就代表該自然數的位數。這種判斷比數學判斷方法在邏輯上要簡單一些。
關于String類的使用就介紹這么多,其它的方法以及這里到的方法的詳細聲明可以參看對應的API文檔。
?
- 前言
- (1)序言
- (2)程序設計是什么?
- (3)你適合學習程序設計嗎?
- (4)如何學好程序設計?
- (5)程序設計介紹小結
- (6)計算機軟件基本概念
- (7)進制的概念
- (8)計算機內部的數據表達
- (9)網絡編程基礎
- (10)Java語言簡介
- (11)JDK的獲得、安裝和配置
- (12)第一個HelloWorld程序
- (13)Eclipse基本使用
- (14)Eclipse基礎使用進階
- (15)如何學好Java語法
- (16)代碼框架、關鍵字和標識符
- (17)基本數據類型
- (18)變量和常量
- (19)數據類型轉換
- (20)空白、語句結束和注釋
- (21)算術運算符
- (22)比較運算符
- (23)邏輯運算符
- (24)賦值運算符
- (25)位運算符
- (26)移位運算符
- (27)其它運算符
- (28)運算符優先級
- (29)表達式
- (30)流程控制基礎
- (31)if語句語法(1)
- (32)if語句語法(2)
- (33)if語句語法(3)
- (34)switch語句語法
- (35)while語句語法
- (36)do-while語句語法
- (37)for語句語法
- (38)break和continue語句
- (39)流程控制綜合示例1
- (40)流程控制綜合示例2
- (41)流程控制綜合示例3
- (42)流程控制綜合練習
- (43)數組概述
- (44)數組基礎語法
- (45)數組使用示例1
- (46)數組使用示例2
- (47)數組使用示例3
- (48)多維數組基礎
- (49)多維數組使用示例1
- (50)多維數組使用示例2
- (51)多維數組練習
- (52)方法聲明
- (53)方法聲明示例
- (54)方法調用
- (55)方法重載和參數傳遞
- (56)方法練習
- (57)面向對象基礎
- (58)類(一)
- (59)類(二)
- (60)對象
- (61)面向對象設計方法和面向對象特性(一)
- (62)繼承(二)
- (63)多態性
- (64)訪問控制符、修飾符和其它關鍵字
- (65)static修飾符
- (66)final修飾符
- (67)this和super
- (68)抽象類和接口(一)
- (69)抽象類和接口(二)
- (70)抽象類和接口(三)
- (71)內部類簡介
- (72)包的概念
- (73)JDK文檔使用
- (74)java.lang包介紹1
- (75)String類使用
- (76)StringBuffer類和System類
- (77)包裝類
- (78)時間和日期處理
- (79)Random隨機處理
- (80)集合框架簡述
- (81)異常處理概述
- (82)異常處理語法1
- (83)異常處理語法2
- (84)IO簡介
- (85)IO類體系
- (86)文件操作之File類使用
- (87)文件操作之讀取文件
- (88)文件操作之寫文件
- (89)讀取控制臺輸入
- (90)裝飾流使用1
- (91)裝飾流使用2
- (92)IO使用注意問題
- (93)多線程基礎
- (94)多線程實現方式1
- (95)多線程實現方式2
- (96)多線程使用示例1
- (97)多線程使用示例2
- (98)多線程問題及處理1
- (99)多線程問題及處理2
- (100)多線程問題及處理3
- (101)網絡編程概述
- (102)網絡編程技術1
- (103)網絡編程技術2
- (104)網絡編程技術3
- (105)網絡編程技術4
- (106)網絡編程技術5
- (107)網絡協議概念
- (108)網絡編程示例1
- (109)網絡編程示例2
- (110)網絡編程小結