第六章、Java字符串處理
第一節、String對象
一、
Java中將字符串作爲String類型對象來處理。當創建一個String對象時,被創建的字符串是不能被改變的。每次需要改變字符串時都要創建一個新的String對象來保存新的內容。原始的字符串不變。之所以採用這種方法是因爲實現固定的,不可變的字符串比實現可變的字符串更高效。對於那些想得到改變的字符串的情況,有一個叫做StringBuffer的String類的友類,它的對象包含了在創建之後可以改變的字符串。
String類和StringBuffer類都在java.lang中定義。因此它們可以自動的被所有程序使用。兩者均被說明爲final,這意味着兩者均不含子類。
二、String構造函數
(1)String(), 默認構造函數,無參數
String s1 = new String();
(2)String( char chars[]) ,傳入字符數組
char[] myChars={'a', 'b', 'c'};
String s2 = new String(myChars) // 使用字符串“abc”初始化s2
(3)String( char chars[], int startIndex, int numChars) ,傳入一個字符數組,從指定下標位置開始獲取指定個數的字符,用這些字符來初始化字符串變量。
char[] myChars={'h', 'e', 'l', 'l', 'o'};
String s3 = new String(myChars,1,3); //使用字符串“ell”初始化s3
(4)String(String strObj),傳入另一個字符串對象,用該字符串對象的內容初始化
String s4= new String(s3); // 這是s4也是“ell”了。
(5)String(byte asciiChars[])
String(byte asciiChars[], int startIndex, int numChars)
儘管Java的char類型使用16位(bit)表示Unicode編碼字符集,在Internet中,
字符串的典型格式使用由ASCII字符集構成的8位數組,因爲8位ASCII字符串是共同的,當給定一個字節(byte)數組時,String類提供了上面兩個初始化字符串的構造函數。
例子:
package Examples;
class SubStringConv{
public static void main(String[] args){
byte ascii[]={65,66,67,68,69,70};
String s1=new String(ascii);
System.out.println(s1);
String s2=new String(ascii,2,3);
System.out.println(s2);
}
}
編譯和運行後輸出:
ABCDEF
CDE
三、
(1)調用字符串的length()方法可以得到該字符串的長度(字符個數);
(2)前面說明了如何使用new運算符創建一個字符串實例。然而這是一種早期的使用字符串常量的處理方法。對於程序中的每一個字符串常量,Java會自動創建String對象。因此,可以使用字符串常量初始化String對象。例如:
String s5="abc";
int i = "abc".length(); //可以將字符串作爲對象來進行操作
(3)可以使用“+”運算符來將兩個字符串連接起來產生一個新的String對象。只要+運算符有一個運算數是字符串(String)實例時,編譯器就將另一個運算數轉換爲它的字符串形式。這種操作是通過調用一個由String類定義的 字符串轉換方法valueOf()來完成的。對於簡單類型,valueOf()方法返回一個字符串,該字符串包含了該類型的值的字符串。對於對象,valueOf()方法調用toString()方法。每一個類都執行toString()方法,因爲它是由Object定義的。toString()方法具有如下一般形式: String toString() 。 toString()方法返回一個String對象(即字符串)。該對象一般是對類的一個描述。
四、一些字符串操作
(1)字符截取
*char charAt(int where) ,注意,這裏返回一個char字符例如:
char a ;
a="abcde".charAt(2); //將索引爲2 ,即第三個字符賦給a
* void getChars(int sourceStart, int sourceEnd, char target[], int targetStart) ,這裏是無返回值方法,指定要截取的子字符串的開始和結束下標,再指定要儲存子字符串內字符的數組,和存放這些字符的起始位置。注意,子字符串並不包括位於結束下標的字符。
* byte[] getBytes() 這是getBytes()方法最簡單的形式,它實現將字符存放於字節數組中。在將字符串(String)值輸出到一個不支持16位Unicode編碼的環境時,getBytes
()是最有用的。例如,大多數Internet協議和文本文件格式在文本交換時使用8位ASCII編碼。
* char[] toCharArray() 將字符串中所有的字符轉換到一個字符數組的最簡當方法,也可以使用getChars()方法實現。
(2)字符串比較
* boolean equals(Object str) 比較兩個字符串對象是否相等,
boolean equalsIgnoreCaseJ(String str) 比較兩個字符串對象,且忽略字符的大小寫
* regionMatches() 方法允許將一個字符串中指定的區間和另一字符串中指定的區間進行比較,它的重載形式允許在比較時忽略大小寫。下面給出這兩種方法的一般形式:
boolean regionMatches(int startIndex,String str2,int str2StartIndex,int numChars)
boolean regionMatches(boolean ignoreCase ,int startIndex,String str2,int str2StartIndex,int numChars)
其中startIndex指定調用此方法的字符串內子字符串的起始位置。
* boolean startsWith(String str) startsWith方法還有第二種形式:
boolean startWith(String str, int startIndex)
boolean endsWith(String str)
上面的方法用來判斷一個給定的字符串是否是從指定的字符串開始或結束。
* int compareTo(String str) 方法用於比較兩個字符串的大小。字符串比較的結果及其含義:
值 |
含義 |
小於0 |
調用此方法的字符串小於參數str |
大於0 |
調用此方法的字符串大於參數str |
等於0 |
兩個字符串相等 |
(3)其他操作
* 搜索字符串:
int indexOf( int ch)
int lastIndexOf( int ch)
int indexOf(String str)
int lastIndexOf(String str)
指定搜索的起始點:
int indexOf( int ch, int startIndex)
int lastIndexOf( int ch ,int startIndex)
int indexOf(String str ,int startIndex)
int lastIndexOf(String str, int startIndex)
* 使用 substring()截取子字符串:
String substring(int startIndex) 注意substring中string沒有大寫,截取指定位置後的子字符串。
String substring(int startIndex,int endIndex) 截取指定起始位置和結束位置的子字符串。注意截取的字字符串不包括結束位置的字符。
* concat() 連接連個字符串,與+ 運算符執行相同功能。
String concat(String str)
* replace() 用另一個字符取代指定字符串中指定字符:
String replace(char original, char replacement) 例如:
String s=”Hello”.replace(‘l’,’w’); //執行後 s =”Hewwo”;
* trim() 返回一個字符串,該字符串是刪除調用字符串前後的空白符所得的字符串
* 改變字符串內字符的大小寫
String toLowerCase() 返回一個所有字母都是小寫的字符串
String toUpperCase()返回一個所有字母都是大寫的字符串
* 使用 valueOf()方法實現數據轉換
例如:
String str = String.valueOf(3) ; //將int類型轉換成字符串類型,其他基本數據類型和任何類的對象也可作爲參數。
第二節、StringBuffer
StringBuffer定義了下面三個構造函數:
StringBuffer() // 默認構造函數,預留了16個字符的空間,該空間不需再分配
StringBuffer(int size) // 設置指定緩衝區大小
StringBuffer(String str) // 設置StringBuffer對象初始化的內容並預留16個字符空間,且不需再分配空間
* int length()
調用length()方法可以得到StringBuffer對象的長度,調用capacity()可以得到總的分配容量。兩個方法都是返回一個int類型的值。
* void ensureCapacity(int capacity)
如果想在構造StringBuffer對象後爲某些字符預分配空間,可以使用ensureCapacity()方法,設置緩衝區的大小,這在事先已知要在StringBuffer上追加大量小字符串的情況下是有用的。ensureCapcity()方法具有如下的一般形式: void ensureCapacity(int capacity)
* void setLength(int len)
使用setLength()方法可以設置StringBuffer對象的長度,它的一般形式如下:
void setLength(int len) 如果len大於StringBuffer對象當前的length()值的話,那麼會在StringBuffer對象後面加上空字符;如果比length()小的話,則len後面的字符串會丟失。
* char charAt(int where)
void setCharAt(int where, char ch)
使用charAt()方法可以得到StringBuffer對象中指定位置上的字符,setCharAt() 可以設置指定位置上的字符。它們的一般形式如下:
char charAt(int where)
void setCharAt(int where,char ch)
對於這兩種法法,where值必須是非負的,同時不能超過或等於StringBuffer對象的長度。
* getChars(int suorceStart,int sourceEnd,char target[] , int targetStart)
* append()
Append()方法將任一其他類型數據的字符串形式連接到調用StringBuffer對象的後面,對所有內置的類型和Object,它都有重載形式。下面是幾種形式:
StringBuffer append(String str)
StringBuffer append(int num)
StringBuffer append(Object obj)
* insert()
Insert()方法將一個字符串插入另一個字符串中。下面是它的幾種形式:
StringBuffer insert(int index,String str)
StringBuffer insert(int index,char ch)
StringBuffer insert(int index,Object obj)
*reverse() // StringBuffer reverse()
StringBuffer strbf=new StringBuffer(“ABCDEFG”);
strbf.reverse();
System.out.println(strbf); //輸出 GFEDCBA
* StringBuffer delete(int startIndex,int endIndex)
StringBuffer deleteCharAt(int loc)
刪除指定位置的字符串和指定位置的字符。例如刪除第一個字符後的所有字符:
strbf.delete(1,strbf.length());
* replace()
它完成在StringBuffer內部用一個字符串代替另一個指定起始位置和結束位置的字符串的功能,注意的是,被代替的字符不包括結束位置上的字符,它的一般形式是,:
StringBuffer replace(int startIndex, int endIndex,String str)
* substring() 返回StringBuffer的一部分值
String substring(int startIndex)
String substring(int startIndex, int endIndex)