在程序中常常會用到字符串,所謂的字符串就是指一連串的字符,它是由多個單個字符鏈接而成的。字符串中能夠包含任意字符,這些字符必須包含在一對雙引號""以內,如"abc"。在Java中定義了String和StringBuffer類來封裝字符串,並提供了一系列操做字符串的方法,它們都位於java.lang包中,所以不須要導包就能夠直接使用。下面將對String類和StringBuffer類詳細講解。java
在操做String類以前,須要先對String類進行初始化,在Java中經過如下方法對String類進行初始化:數組
String str1 = "abc";
方法聲明 | 功能描述 |
String() | 建立一個內容爲空的字符串 |
String(String value) | 根據指定的字符串內容建立對象 |
String(char[] value) | 根據指定的字符數組建立對象app |
下面經過一個例子來學習String類的使用:學習
Example01.javaui
public class Example01{ public static void main(String[] args) { //建立一個空的字符串 String str1 = new String(); //建立一個內容爲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); } }
運行結果以下:spa
方法聲明 | 功能描述 |
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()code |
返回一個新字符串,它去除了原字符串首尾的空格對象 |
下面經過一些例子來具體的學習一下這些方法。blog
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(字符串角標越界異常)。
因爲字符串是常量(用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("一、添加-----------------------"); add(); System.out.println("二、刪除-----------------------"); remove(); System.out.println("三、修改-----------------------"); 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 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
下面經過一個綜合的例子來複習上面學習的知識點:
記錄一個子串在整串中出現的次數。
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; } }