1. 程式人生 > >Java.lang包——字串類(String, StringBuffer)

Java.lang包——字串類(String, StringBuffer)

Java.lang 包——字串類 (String, StringBuffer)

作者: zccst

先提及一下陣列, C++ 不同的是, Java 所有的陣列都是動態分配儲存空間。一但分配了儲存空間,就不能在程式中改變陣列長度,但可以用 new 重新分配空間。在 Java 中,陣列是一種類,有自己的屬性和方法。比較常用的是 length 方法,用於返回陣列的長度。

回憶一下嚴蔚敏 C 語言描述的《資料結構》(第二版),都有哪幾種資料結構?

常見的是:

1. 線性表(包括順序表和連結串列)

2. 堆疊和佇列

3.

4. 陣列和廣義表

5. 樹和二叉樹

6.

既然陣列在 Java 中封裝成類,不難發現,其實這些資料結構在 java 中全部封裝成了類。串也不例外,所以也封裝成了類。

字串類—— String 類和 StringBuffer

程式中用到的字串可以分為兩類:

1. String 類:建立之後不能再修改和變動的字串常量。

String java 的開發者構造得非常接近基本資料型別,換句話說,在很多時候可以象使用基本資料型別一樣來使用

String 類,例如:

// 聲明瞭一個空字串 s

String s

String ss = ” 建立了一個字串 ”;

// 聲明瞭一個空字串 s

String s = new String();

String ss = new String(” 建立了一個字串 ”);

String []sa = new String[]{” 建立了一個字串 ”, “ 陣列 ”};

常用的方法有:

int length() // 返回字串長度

boolean equals(Object anObject) //

比較字串相等

String substring(int beginIndex) // 返回從 beginindex 開始的子串。

String substring(int beginIndex,int endIndex) // 返回從 beginIndex endIndex 的子串

char charAt(int index) // 返回 index 指定位置的字元

int indexOf(String str) // 返回 str 在字串第一次出現的位置

String replace(char oldChar,char newChar) // 替換字串中所有的 oldChar 子串

更多方法請查閱本文《附錄 1 String 類的常用方法》

2. StringBuffer 類:建立之後可以修改和變動的字串變數。即能插入字元,也能追加字元到串尾。 StringBuffer 類物件的長度是可變的(即 StringBuff 是可變長的字串物件 )。

常用方法有:

int length(); // 獲取當前物件的長度

int capacity(); // 獲取當前物件的容量。

StringBuff append( …… ); // 將物件,字串等新增到 StringBuff 物件中去。

StringBuff insert(int offset, …… ); // 將物件,字串等插入到指定的位置。

其中主要的方法是 append insert ,可以過載和接收任何型別的資料。

String 類和 StringBuffer 類都在 java lang 包中,並被定義為最終類,不能再派生子類。

如果你只是瞭解一下,可以到此為止。如果你想深入理解字串類,請繼續下去。

本文框架(本文由以下內容構成):

String 類(構造方法,常用方法,例項)

StringBuffer 類(構造方法,常用方法,例項)

字串類總結(特點比較)

附錄 1 String 類的常用方法(表格形式,方便查詢)

附錄 2 StringTokenizer 類(擴充套件知識)

String

一、 String 類——常用構造方法

String() 用來建立一個空的字串常量

String(String str) 利用一個已經存在的字串常量,來建立一個新的 String 物件

String(StringBuffer buf) 利用一個已經存在的 StringBuffer 物件,來建立新的 String 物件

String(char c[]) 利用已經存在的字元陣列的內容,來建立新的 String 物件

其原型是:

1. 用擴在雙引號 (“”) 裡面的一串字串做引數構造字串

Public String(String value);

2. 用字元作為建構函式

Public String(char value[]);

Public String(char value, int offset, int count);

3. 用指定的緩衝字串物件 buffer 構造字串物件

Public String(StringBuffer buffer);

4. 用位元組陣列作為引數構造字串

Public String(byte[] bytes);

Public String(byte[] bytes, String enc);

Public String(byte[] bytes, int offset, int length);

Public String(byte[] bytes, int offset, int length, String enc);

舉例

String str = new String(“I like Java”);

Char ch[] = {‘a’, ‘b’, ‘c’, ‘d’, ‘e’};

String s1 = new String(ch); // s1 ”abcde”

String s2 = new String(ch, 2, 3); // s2 ”cde”

StringBuffer buff = new StringBuffer();

Buff.append(“a”);

Buff.append(“5.6”);

String s1 = new String(buff); // s1 ”a5.6”

二、 String 類——常用方法

1 ,求字串長度

public int Length() // 用於獲得當前字串物件中字元的個數

例: String s = “ 歡迎使用 java 語言 ”;

Int len = s.length();

結果: len = 10

注: java 採用 Unicode 編碼,每個字元為 16 為長,因此漢字和其他符號一樣只佔用一個字元。

2 ,字串連線

public String concat(String str) // 用於將字串 str 連線在當前字串的尾部,並返回新的字串

例: “to”.concat(“get”).concat(“her”) 的返回值為 ”together”

例: String str = “hello”;

str = str + “world” +2;

str 的值為 ”hello world 2”;

注:利用 ” + ” ,編譯器講自動把非字串轉換為字串再進行連線。

3 ,字串比較

boolean equals(Object o) // 用於將當前字串與方法引數列表中給出的字串物件 o 作比較,若相同則返回 true ,否則返回 false ,區分大小寫

boolean equalsIgnoreCase(String str) // 用於將當前字串與方法引數列表中給出的字串物件 str 作比較,若相同則返回 true ,否則返回 false ,不區分大小寫

int compareTo(String str) // 用於將當前字串與引數中字串物件 str 作比較,若完全相同則返回 0 ;若按字母順序大於引數字串,則返回一個大於 0 的整數;反之,則返回一個小於 0 的整數

int compareTo(Object object)

int compareToIgnoreCase(String str)

例: String str3 = “This”;

String str2 = “That”;

System.out.println(“ 結果 1 ”+str3.equals(“this”)+”,”+str3.equalsIgnoreCase(”this”));

System.out.println(“ 結果 2 ”+str2. compareTo (“that”)+”,”+str2. compareTo IgnoreCase(”that”));

輸出:結果 1 false, true;

結果 2 -32,0;

注:在前文《 Java.lang 包—— Object 類》中使用關係運算符“ == ”判定兩個 object ,作為繼承了 object 類的字串類,同理也可以用“ == ”判定兩個字串是否相等,並且其使用規則也一樣。

4 ,轉化字串的大小寫

Public String toLowerCase() // 將字串中所有的大寫字母轉換成小寫

Public String toUpperCase() // 將字串中所有的小寫字母轉換成大寫

例如: StringCaseChange.java

public class StringCaseChange

{

public static void main(String[] args)

{

String str = "Hello world.This is a Java code.";

// 宣告並初始化字串

System.out.println("The str is :");

System.out.println(str);

System.out.println("to UpperCase:");

System.out.println(str.toUpperCase());

// 字串物件 str 呼叫 toUpperCase() 方法,並輸出返回值

System.out.println(str.toLowerCase());

// 字串物件 str 呼叫 toLowerCase() 方法,並輸出返回值

System.out.println(str);

// 輸出原字串 str

}

}

5 ,字串擷取

public char charAt(int index) // 返回 index 指定位置的字元

public String subString(int start) // 返回從 start 開始的子串。

public String subString(int start, int end) // 返回從 start end 的子串

例: String str = “hello world”;

char charValue = str.charAt(2);

String s1 = str.subString(2);

String s2 = str.subString(6, 11);

結果: charValue = ‘1’;

s1 = “llo world”;

s2 = “world”;

注: start end 的位置需特別小心。

6 ,判斷一個字元的字首和字尾

public boolean startsWith(String prefix) // 用於判斷當前字串的字首,是否是指定的字串物件 str ,若是則返回 true ,否則返回 false

public boolean endsWith(String suffix) // 用於判斷當前字串的字尾,是否是指定的字串物件 str ,若是則返回 true ,否則返回 false

public boolean startsWith(String prefix, int offset)

注:偏移量從 0 開始計數。

綜合例子 1 String 類物件的建立及使用 StringDemo.java

public class StringDemo

{

String str1 = "Hello world!This is Java code."; // 宣告並初始化字串 str1

String str2; // 宣告字串 str2

String str3 = new String("This is Java code."); // 宣告並初始化字串 str3

public StringDemo()

{

str2 = new String("This is Java code.");

// 建立字串物件 str2 並初始化

System.out.println("str1 is: "+str1);

System.out.println("str2 is: "+str2);

System.out.println("str3 is: "+str3+"/n");

System.out.println("Each item of str1 is:");

for(int i=0;i<str1.length();i++)

{ // 使用 charAt() 方法得到 String 字串中指定位置的字元,並利用迴圈分別輸出

char c = str1.charAt(i);

System.out.print("/""+c+"/",");

if((i+1)%10==0) System.out.println();

}

System.out.println();

byte b[] = str1.getBytes();

// 使用 String 類的 getBytes() 方法,得到 str1 中所有字元對應的 Unicode 編碼,並存入 byte 型陣列 b

System.out.println("Change each item of str1 to unicode is:");

for(int i=0;i<b.length;i++)

{ // 利用迴圈分別輸出 str1 中,所有元素對應的字元的 Unicode 編碼

System.out.print(b[i]+",");

if((i+1)%10==0) System.out.println();

}

System.out.println();

System.out.print("The result of comparing str2 and str3 is:");

System.out.println(str2.equals(str3));

// 將字串物件 str2 str3 進行比較,並將返回值輸出

System.out.println("/nReplace all charcters /"a/" to /"e/" in str2");

System.out.println("The result of str2.replace() is:"+str2.replace('a','e'));

// 將字串 str2 呼叫 replace() 方法的結果輸出

System.out.println("str2 is: "+str2+"/n");

System.out.print("The result of whether str1 is beginning with /"Hello/":");

System.out.println(str1.startsWith("Hello"));

System.out.print("The result of whether str3 is end with /"code./":");

System.out.println(str3.startsWith("code."));

}

public static void main(String[] args)

{

StringDemo stringDemo = new StringDemo();

}

}

綜合例子 2 String 類部分方法測試 StringMethodDemo.java

public class StringMethodDemo

{

public static void main(String[] args)

{

String str1 = "abc";

String str2 = "aab";

String str3 = "abd";

String str4 = "abc";

String str5 = "ABC";

String str6 = "abcdefgabcde";

// 以上完成字串的宣告及初始化

int i = str1.compareTo(str2);

int j = str1.compareTo(str3);

int k = str1.compareTo(str4);

// 以上呼叫 String compareTo() 方法來比較字串

System.out.println("str1 is:"+str1);

System.out.println("str2 is:"+str2);

System.out.println("str3 is:"+str3);

System.out.println("str4 is:"+str4);

System.out.println("str5 is:"+str5);

System.out.println("str6 is:"+str6);

System.out.print("The result of str1 compareTo str2 is:");

System.out.println(i);

System.out.print("The result of str1 compareTo str3 is:");

System.out.println(j);

System.out.print("The result of str1 compareTo str4 is:");

System.out.println(k);

System.out.print("The result of str1 equals str5 is:");

System.out.println(str1.equals(str5));

// 呼叫 String equals() 方法來比較字串

System.out.print("The result of str1 equalsIgnoreCase str5 is:");

System.out.println(str1.equalsIgnoreCase(str5));

// 呼叫 String equalsIgnoreCase() 方法來比較字串

int m = str6.indexOf((int)'d');

// 呼叫 String indexOf() 方法,返回字元 'd' 第一次出現的位置

System.out.println("The char /"d/" first appear position is :"+m);

int n = str6.indexOf((int)'d',4);

// 呼叫 String indexOf() 方法,返回字元 'd' 從第四位後,首次出現的位置

System.out.println("After 4th position The char/"d/"appear position is:"+n);

}

}

三、 String 類——查詢指定字元、字串和替換

由於檢索對字串特別重要,為突出其重要性,故單獨列出。

1 ,查詢字元

int indexOf(char a) // 用於查詢並返回當前字串中,某個特定字元 a 第一次出現的位置

int indexOf(char a,int b) // 用於從當前字串中,自 b 位個字元之後向後查詢並返回某個特定字元 a 第一次出現的位置

int lastIndexOf(char a) // 用於查詢並返回當前字串中,某個特定字元 a 最後一次出現的位置

int lastIndexOf(char a, int b) // 用於從當前字串中,自 b 位個字元之後向後查詢並返回某個特定字元 a 最後一次出現的位置

2 ,查詢字串

int indexOf(String str) // 用於查詢並返回當前字串中,某個特定字串 str 第一次出現的位置

int indexOf(String str,int a) // 用於從當前字串中,自 a 位個字元之後向後查詢並返回某個特定字串 str 第一次出現的位置

int lastIndexOf(String str) // 用於查詢並返回當前字串中,某個特定字串 str 最後一次出現的位置

int lastIndexOf(String str int a) // 用於從當前字串中,自 a 位個字元之後向後查詢並返回某個特定字串 str ,最後一次出現位置

例如: StringSearchDemo.java

public class StringSearchDemo

{

public static void main(String[] args)

{

String str1 = "Hello world.This is a Java code.we will program Java code.";

String searchStr = "Java code";

// 以上宣告建立了字串物件

int i = str1.indexOf(searchStr);

// 在字串 str1 中,查詢並返回字串物件 searchStr 的位置

int j = str1.indexOf(searchStr,str1.indexOf("we"));

// 在字串 str1 中,從字串 "we" 開始,查詢並返回字串物件 searchStr 的位置

int m = str1.lastIndexOf(searchStr);

// 在字串 str1 中,查詢並返回字串物件 searchStr 最後一次出現的位置

System.out.println("str1 is:"+str1);

System.out.println("searchStr is:"+searchStr);

System.out.println("i = str1.indexOf(searchStr):"+i);

System.out.println("j=str1.indexOf(searchStr,str1.indexOf(/"we/")):"+j);

System.out.println("m = str1.lastIndexOf(searchStr):"+m);

}

}

3 ,替換字元(包括字串)

String replace(char c1,char c2) // 用於將當前字串中的所有 c1 指定的字元替換為 c2 指定的字元,並返回新的字串

四、 String 類——字串轉換為位元組陣列或字元陣列

1 ,位元組陣列

byte [] getBytes();

byte [] getBytes(String enc); //enc 是字符集編碼

2 ,字元陣列

char [] toCharArray();

char [] toCharArray(int srcBegin, int srcEnd, char[] dst, int dstBegin);

例: byte byteArr[];

char charArr[];

String str = "This is s test string";

byteArr = str.getBytes();

charArr = str.toCharArray();

原始碼: StringToArray.java

public class StringToArray{

public static void main(String[] args){

String s="ABCDE";

byte b[]=s.getBytes();

System.out.println("/t"+s);

for(int i=0;i<b.length;i++)

System.out.print("/t"+b[i]);

System.out.println();

char ch0[]=s.toCharArray();

myPrint(ch0);

char ch1[]=new char[3];

s.getChars(1,4,ch1,0);

myPrint(ch1);

}

static void myPrint(char[] obj){

for(int i=0;i<obj.length;i++)

System.out.print("/t"+obj[i]);

System.out.println();

}

}

StringBuffer

StringBuffer 類是可變字串類,建立 StringBuffer 類的物件後,可以隨意修改、變更字串的內容。每個 StringBuffer 的物件,都能夠儲存指定容量的字串,如果字串的長度超過了 StringBuffer 類物件的容量,則該物件的容量會自動的擴大。

一、 StringBuffer 類——構造方法

StringBuffer() // 用於建立一個空的 StringBuffer 物件

StringBuffer(int length) // 用於建立一個長度為 length StringBuffer 物件

StringBuffer(String str) // 返回一個字串,初始化為 s ,長度為 s.length()+16 個位元組

例: StringBuffer sb = new StringBuffer();

StringBuffer sb = new StringBuffer(32);

StringBuffer sb = new StringBuffer(“I like this”);

注:系統為 String 類物件分配記憶體是,按照物件中所含字元的實際個數等量分配。而 StringBuffer 類物件分配記憶體時,出去字元所佔空間外,再另加 16 個字元大小的緩衝區。

二、StringBuffer 類——主要方法(全為 public

1 ,獲得長度、容量和設定長度

int capacity() // 用於獲取可變字串的當前容量,值為字串長度 +16

void setLength(int a) // 用於設定當前可變字串的長度

int length() // 用於獲取可變字串的長度,值為字串長度

例: StringBuffer buf = new StringBuffer(“0123”);

buf.length() = 4;

buf.capacity() = 4 + 16 = 20;

一般 StringBuffer 的長度 (length) 是指儲存在其中的字元個數,容量 (capacity) 是指緩衝區所能容納的最大字元數。

2 append replace reverse

StringBuffer append(Object obj) // 將物件引數以字串的方式,加入到當前可變字串中

StringBuffer append(String str) // 將給定的字串,追加到當前可變字串中

StringBuffer append(StringBuffer sb) // 將給定的可變字串,追加到當前可變字串中

StringBuffer replace(int a,int b,String str)// 使用新的字串 str ,替換當前可變字串中,起始位置為 a ,結束位置為 b 之間的內容

StringBuffer reverse(int start, int end, String str)

注: append 共有 11 個方法,上面僅列出常見的 3 個。

3 insert delete

StringBuffer insert(int offset,Object obj) // 將物件引數以字串的方式,插入到當前可變字串中指定位置

StringBuffer insert(int offset,String str) // 將給定字串,插入到當前可變字串中指定位置

StringBuffer delete(int a,int b) // 用於刪除掉當前可變字串中,起始位置為 a ,結束位置為 b 之間的內容

StringBuffer deleteCharAt(int a) // 用於刪除指定索引位置處的字元

void setCharAt(int a,char ch) // 將給定字元 ch ,插入到當前可變字串中指定索引位置處

4 ,其他

String toString() // 獲得一個字串常量來代表當前可變字串

String substring(int start)

String substring(int start , int end);

注: insert 共有 10 個方法,上面僅列出常見的 2 個。

三、例項

1, StringBuffer 類的建立和使用

例如: StringBuffer 類物件的建立及使用 StringBufferDemo.java

public class StringBufferDemo

{

StringBuffer strBuf1 = new StringBuffer("Hello world!");

// 宣告、建立並初始化 StringBuffer 類的物件 strBuf1

StringBuffer strBuf2;

// 宣告 StringBuffer 類的物件 strBuf2

StringBuffer strBuf3 = new StringBuffer(10);

// 宣告並建立 StringBuffer 類的物件 strBuf3 ,並設定其長度為 10

public StringBufferDemo()

{

strBuf2 = new StringBuffer("This is Java code.");

// 建立並初始化 StringBuffer 類的物件 strBuf2

strBuf3 = new StringBuffer("Hello");

// 建立並初始化 StringBuffer 類的物件 strBuf3

String output = "strBuf1:"+strBuf1.toString()+"/nlength="+ strBuf1.

length()+"/ncapacity="+strBuf1.capacity();

// 使用 StringBuffer 類的方法 toString() ,將 StringBuffer 類物件轉化為 String

型字串

// 使用 StringBuffer 類的方法 length() ,來獲得該可變字串的長度

// 使用 StringBuffer 類的方法 capacity() ,來獲得該可變字串的最大儲存容量

System.out.println(output);

strBuf1.setLength(30);

// 使用 StringBuffer 類的方法 setLength() ,來設定可變字串的長度

System.out.print("After add strBuf1's length,");

System.out.println("strBuf1's capacity is:"+strBuf1.length());

strBuf1.ensureCapacity(60);

// 使用 StringBuffer 類的方法 ensureCapacity() ,來設定可變字串的最大儲存容量

System.out.print("Set strBuf1's capacity,");

System.out.println("Now strBuf1's capacity is:"+strBuf1.capacity());

System.out.println();

System.out.println("strBuf2:"+strBuf2.toString());

System.out.println("Char at 0 in strBuf2 is:"+strBuf2.charAt(0));

System.out.println("Char at 9 in strBuf2 is:"+strBuf2.charAt(9));

char ch[] = new char[strBuf2.length()];

strBuf2.getChars(8,12,ch,0);

// 使用 StringBuffer 類的方法 getChars() ,來獲取 strBuf2 中第 8 12 位的字元

System.out.println("The char from 8 to 12 is:");

for(int i=0;i<4;i