JAVA API(一)String類和StringBuffer類
1.String類和StringBuffer類
在程序中經常會用到字符串,所謂的字符串就是指一連串的字符,它是由多個單個字符連接而成的。字符串中可以包含任意字符,這些字符必須包含在一對雙引號""之內,如"abc"。在Java中定義了String和StringBuffer類來封裝字符串,並提供了一系列操作字符串的方法,它們都位於java.lang包中,因此不需要導包就可以直接使用。下面將對String類和StringBuffer類詳細講解。
1.1String類的初始化
在操作String類之前,需要先對String類進行初始化,在Java中通過以下方法對String類進行初始化:
- 使用字符串常量直接初始化String對象。如 :
String str1 = "abc";
- 使用String的構造方法初始化字符串對象,String類的構造方法如下表:
方法聲明 功能描述 String() 創建一個內容為空的字符串 String(String value) 根據指定的字符串內容創建對象 String(char[] value) 根據指定的字符數組創建對象
下面通過一個例子來學習String類的使用:
Example01.java
public class Example01{ public static void main(String[] args) { //創建一個空的字符串 String str1 = newString(); //創建一個內容為abcd的字符串 String str2 = new String("abcd"); //創建一個內容為字符串數組的字符串 char[] charArray = new char[]{‘A‘,‘B‘,‘C‘,‘D‘}; String str3 = new String(charArray); System.out.println("a" + str1 + "b"); System.out.println(str2); System.out.println(str3); } }
運行結果如下:
1.2String類的常見操作
方法聲明 | 功能描述 |
int indexOf(int ch) | 返回指定字符在此字符串中第一次出現處的索引 |
int lastIndexOf(int ch) | 返回指定字符在此字符串中最後一次出現處的索引 |
int indexOf(String str) | 返回指定子字符串在此字符串中第一次出現處的索引 |
int lastIndexOf(String str) | 返回指定子字符串在此字符串中最後一次出現處的索引 |
char charAt(int index) | 返回字符串中index位置上的字符,其中,index的取值範圍是0-(字符串長度-1) |
boolean endsWith(String suffix) | 判斷此字符串是否以指定的字符串結尾 |
int length() | 返回此字符串的長度 |
boolean equals(Object anObject) | 將此字符串與指定的字符串比較 |
boolean isEmpty() | 當且僅當字符串長度為0時返回true |
boolean startsWith(String prefix) | 判斷此字符串是否以指定的字符串開始 |
boolean contains(CharSequence cs) | 判斷此字符串中是否包含指定的字符序列 |
String toLowerCase() | 使用默認語言環境的規則將String中的所有字符都轉換為小寫 |
String toUpperCase() | 使用默認語言環境的規則將String中的所有字符都轉換為大寫 |
static String valueOf(int i) | 返回int參數的字符串表示形式 |
char[] toCharArray() | 將此字符串轉換為一個字符數組 |
String replace(CharSequence oldstr,CharSequence newstr) | 返回一個新的字符串,它是通過用newstr替換此字符串中出現的所有oldstr得到的 |
String[] split(String regex) | 根據參數regex將原來的字符串分割為若幹子字符串 |
String substring(int beginIndex) | 返回一個新字符串,它包含從指定的beginIndex出開始直到此字符串末尾的所有字符 |
String substring(int beginIndex,int endIndex) | 返回一個新字符串,它包含從指定的beginIndex出開始直到索引endIndex-1處的所有字符 |
String trim() |
返回一個新字符串,它去除了原字符串首尾的空格 |
下面通過一些例子來具體的學習一下這些方法。
Example02.java
public class Example02 { public static void main(String[] args) { String s = "ababcdedcba";//聲明字符串 System.out.println("字符串的長度為:" + s.length());//獲取字符串長度,即字符個數 System.out.println("字符串中第一個字符:" + s.charAt(0)); System.out.println("字符c第一次出現的位置:" + s.indexOf(‘c‘)); System.out.println("字符c最後一次出現的位置:" + s.lastIndexOf(‘c‘)); System.out.println("子字符串第一次出現的位置:" + s.indexOf("ab")); System.out.println("子字符串最後一次出現的位置:" + s.lastIndexOf("ab")); } }
運行結果如下:
從上面的運行結果可以看出,String類提供的方法可以很方便的獲取字符串的長度,獲取指定位置的字符以及指定字符和字符串的位置。
Example03.java
public class Example03 { public static void main(String[] args) { String str = "abcd"; System.out.println("將字符串轉換為字符數組後的結果:"); char[] charArray = str.toCharArray();//字符串轉換為字符數組 for (int i= 0; i< charArray.length; i++) { if (i != charArray.length-1) { //如果不是數組的最後一個元素,在元素後面加逗號 System.out.print(charArray[i] + ","); }else { //數組的最後一個元素後面不加逗號 System.out.println(charArray[i]); } } System.out.println("將int值轉換為String類型之後的結果:" + String.valueOf(12)); System.out.println("將字符串轉換成大寫之後的結果:" + str.toUpperCase()); } }
運行結果如下:
使用String類的toCharArray()方法將一個字符串轉為一個字符數組,靜態方法valueOf()將一個int類型的整數轉為字符串,toUpperCase()方法將字符串中的字符都轉為大寫。其中,valueOf()方法有很多重載的形式,float,double,char等其他基本類型的數據都可以通過該方法轉換為String類型字符串。
Example04.java
public class Example04 { public static void main(String[] args) { String s = "baidu"; //字符串替換操作 System.out.println("將du替換成du.com的結果:" + s.replace("du", "du.com")); //字符串去除空格操作 String s1 = " b a i d d u "; System.out.println("去除字符串兩端空格後的結果:" + s1.trim()); System.out.println("去除字符串中所有空格後的結果:" + s1.replace(" ", "")); } }
運行結果如下:
replace()方法用於將字符串中所有與指定字符串匹配的子串替換成另一個字符串,trim()方法用於去除字符串中的空格。需要註意的是,該方法只能去除兩端的空格,不能去除在中間的空格。若想要去除字符串中間的空格,則可以調用String類的replace()方法。
Example05
public class Example05 { public static void main(String[] args) { String s1 = "String";//聲明一個字符串 String s2 = "Str"; System.out.println("判斷是否以字符串Str開頭:" + s1.startsWith(s2)); System.out.println("判斷是否以字符串ng結尾:" + s1.endsWith("ng")); System.out.println("判斷是否包含字符串tri:" + s1.contains("tri")); System.out.println("判斷字符串是否為空:" + s1.isEmpty()); System.out.println("判斷兩個字符串是否相等:" + s1.equals(s2)); } }
運行結果如下:
上面例子中涉及到的方法都是用於判斷字符串的,並且返回值都是boolean類型。其中,equals()方法比較重要,該方法將弗雷Object中的equals()方法進行了重寫。
在程序中可以通過"==" 和equals()兩種方式對字符串進行比較,但是這兩種方式有明顯的區別。equals()方法用於比較兩個字符串中的字符是是否相等,==方法用於比較兩個字符串對象的地址是否相等。對於兩個字符串對象,當它們的字符內容完全相同時,使用equals()判斷結果會為true,但是用==判斷時,結果一定為false。如下面的代碼:
String str1 = new String("abc"); String str2 = new String("abc"); //結果為false,因為str1和str2是兩個對象 System.out.println(str1 == str2); //結果為true,因為str1和str2字符內容相同 System.out.println(str1.equals(str2));
Example06.java
public class Example06 { public static void main(String[] args) { String str = "羽毛球-籃球-乒乓球"; //下面是字符串截取操作 System.out.println("從第5個字符截取到末尾的結果:" + str.substring(4)); System.out.println("從第5個字符截取到第6個字符的結果:" + str.substring(4, 6)); //下面是字符串分割操作 System.out.print("分割後的字符串數組中的元素依次為:"); String[] strArray = str.split("-");//將字符串轉換為字符串數組 for (int i = 0; i < strArray.length; i++) { if (i!=strArray.length-1) { //如果不是數組的最後一個元素,在元素後面加逗號 System.out.print(strArray[i] + ","); }else { //數組的最後一個元素後面不加逗號 System.out.println(strArray[i]); } } } }
註意:String字符串在獲取某個字符時,會用到字符的索引。當訪問字符串中的字符時,如果字符的索引不存在,則會發生StringIndexOutOfBoundsException(字符串角標越界異常)。
1.3StringBuffer類
由於字符串是常量(用final修飾符修飾的),因此一旦創建後,其內容和長度是不可更改的。如果需要對字符串進行修改,則只能創建一個新的字符串對象,這樣會因為內存的消耗和操作的不便。為了方便對字符串進行修改,Java提供了一個StringBuffer類(字符串緩沖區)。StringBuffer類和String類最大的區別就是它的內容和長度是可變的。StringBuffer類相當於一個容器,在對其中的內容進行修改(添加和刪除)時,不會產生新的StringBuffer對象。
下面是StringBuffer類的一系列常用方法:
方法聲明 | 功能描述 |
StringBuffer(char c) | 添加參數到StringBuffer對象中 |
StringBuffer insert(int offset,String str) | 將字符串中的offset位置插入字符串str |
StringBuffer deleteCharAt(int index) | 移除此序列指定位置的字符 |
StringBuffer delete(int start,int end) | 刪除StringBuffer對象中指定範圍的字符或字符串序列 |
StringBuffer replace(int start,int end,String s) | 在StringBuffer對象中替換指定的字符或字符串序列 |
void setCharAt(int index,char ch) | 修改指定位置index處的字符序列 |
String toString() | 返回StringBuffer緩沖區中的字符串 |
StringBuffer reverse() | 將此字符串列用其反轉形式取代 |
下面通過一些例子來學習StringBuffer類的常用方法。
Example07.java
public class Example07 { public static void main(String[] args) { System.out.println("1、添加-----------------------"); add(); System.out.println("2、刪除-----------------------"); remove(); System.out.println("3、修改-----------------------"); alter(); } private static void add() { StringBuffer sb = new StringBuffer();//定義一個字符串緩沖區 sb.append("abcdefg");//在末尾添加字符 System.out.println("append添加結果:" + sb); sb.insert(2, "123");//在指定位置插入字符串 System.out.println("insert添加結果:" + sb); } private static void remove() { StringBuffer sb = new StringBuffer("abcdefg"); sb.delete(1, 5);//指定範圍刪除 System.out.println("刪除指定位置結果:" + sb); sb.deleteCharAt(2); System.out.println("刪除指定位置結果:" + sb); sb.delete(0, sb.length());//清空緩沖區 System.out.println("清空緩沖區結果:" + sb); } private static void alter() { StringBuffer sb = new StringBuffer("abcdef"); sb.setCharAt(1, ‘p‘);//修改指定位置字符 System.out.println("修改指定位置富足結果:" + sb); sb.replace(1, 3, "qq");//替換指定位置字符串或字符 System.out.println("替換指定位置字符(串)結果 :" + sb); System.out.println("字符串反轉結果:" + sb.reverse()); } }
運行結果如下:
在上面的例子中,append()和insert()方法是最常用的,並且這兩個方法有很多重載形式,它們都用於添加字符。不同的是,append()方法始終將這個字符添加到緩沖區的末尾,而insert()方法則可以在指定的位置添加字符。另外,delete()方法用於刪除指定位置的字符,setCharAt()和replace()方法用於替換指定位置的字符。
StringBuffer類和String類有很多相似之處。下面簡單歸納一下兩種的不同點:
- String類表示的字符串是常量,一旦創建後,內容和長度都是無法更改的。而StringBuffer表示字符容器,其內容和長度可以隨時修改。在操作字符串時,如果該字符串僅用於表示數據類型,則使用String類即可。但是如果需要對字符串中的字符進行修改操作(增刪),則使用StringBuffer類。String類覆蓋了Object類的equals()方法,而StringBuffer類沒有覆蓋Object類的equals()方法,如下代碼:
String str1 = new String("abc"); String str2 = new String("abc"); System.out.println(str1.equals(str2));//打印結果為true StringBuffer sb1 = new StringBuffer("abc"); StringBuffer sb2 = new StringBuffer("abc"); System.out.println(sb1.equals(str2));//打印結果為false
- String類對象可以用操作符"+"進行連接,而StringBuffer類對象之間不能。
下面通過一個綜合的例子來復習上面學習的知識點:
記錄一個子串在整串中出現的次數。
package main; public class StringTest { public static void main(String[] args) { String str = "nbaernbatnbaynbauinbaopnba";//整串 String key = "nba";//子串 int count = getKeyStringCount(str,key); System.out.println("count=" + count); } /** * 獲取子串在整串中出現的次數 * @param str * @param key * @return */ private static int getKeyStringCount(String str, String key) { //定義計數器,記錄出現的次數 int count = 0; //如果整串中不包含子串,則直接返回count if (!str.contains(key)) { return count; } //定義變量記錄key出現的位置 int index = 0; while ((index = str.indexOf(key)) != -1) { str = str.substring(index + key.length()); count ++ ; } return count; } }
JAVA API(一)String類和StringBuffer類