String類的學習總結
1.字串的建立
建立字串,可用String str=new String("HelloWorld")進行建立。String()是String類的其中一個構造方法,String()類的構造方法有:
String()、String(char a[])、String(String str)、String(String str,int index,int end)
2.字串操作
(1)字串連線:將兩個字串連線,可以使用“+”號。值得注意的是,String字串是字串常量,是不可以改變它的值的。我們之所以能夠用“+”運算子將兩個字串進行連線,例如:
String str1="hello"; String str2=",world!"; str1+=str2;
這裡好像是將str1的值改變了,其實是在堆空間中重新分配一塊記憶體空間,將原str1和str2的值複製給它,再使String類物件的引用str1指向新的物件,這樣操作效率固然慢。
記憶體分析圖:
String類字串常量對字串進行改變的操作比StringBuilder和StringBuffer,而StringBuffer對字串的操作要比StringBuilder類慢。但StringBuilder只適用於單執行緒,對於多執行緒操作容易出錯,而StringBuffer類使用於多執行緒。因此,若不是經常改變某字串的值,應使用String,若要經常改變字串,在單執行緒中適合使用StringBuilder類,在多執行緒中適合使用StringBuffer類。
還要注意的是,當使用“+”運算子將字串與其它型別如int\double\float等基本型別和引用型別連線時,將自動轉換為字串型別。因此,對於字串連線其他型別的資料,我們要謹慎使用,否則可能會得到意想不到的結果。
(2)獲取字串資訊
本節獲取字串資訊的操作主要包括獲取字串的長度、指定下標的某個字元、指定字元的下標。想要獲取字串的長度,可以使用str.length(),這裡要和獲取陣列的長度arr.length區分開來,這裡比較容易混淆。str.length方法的完整宣告為:"public int length(){........}。對於獲取指定字元的下標,有兩種方法public int indexOf(String str)和public int lastIndexOf(String str),indexOf(String str)方法用於返回指定字串第一次出現的位置,而不是返回指定字串的全部位置,而lastIndexOf(String str)恰好相反,顧名思義,返回指定字串最後出現的位置。要注意,若我們指定的是字串,則使用這兩種方法所返回的下標值都為指定字串的第一個字元的下標,而不是最後一個字元的下標。如果我們指定的字串不在該字串(str)中,則返回-1。若我們這樣使用:str.lastIndexOf(""),它的作用等價於使用str.length(),返回的是字串的長度。利用這個方法,我們可以計算指定字串在某字串中出現的次數,如:
package com.XueFeng.String;
public class Test {
public static void main(String[] args) {
String str=new String("javaIlowaJavajavajjajejavaslejava");
int count=0;
int index=-1;
String str1=new String("java");
while(str.indexOf(str1)!=-1) {
index=str.indexOf(str1);
str=str.substring(index+str1.length());
count++;
}
System.out.println(str1+"出現的次數:"+count);
}
}
charAt()方法用於獲取指定下標的字元,它的完整表達是:public char charAt(int index)。
(3)替換字串
public String replace(String str1,String str2),replace()方法會替換字串中所有的指定子字串,str1表示將要被替換的字串,str2表示用來替換的字串,如下面的程式碼:
public class TestReplace {
public static void main(String[] args) {
String str1="javaIsiajavajavvajfjava ";
System.out.println("輸出原字串:"+str1);
String str2=str1.replace("java","c++");
System.out.println("修改後的字串:"+str2);
}
}
輸出結果: 輸出原字串:javaIsiajavajavvajfjava
修改後的字串:c++Isiac++javvajfc++
public String replaceFirst(String str1,String str2)和replace()的不同之處在於它只替換字串中指定字元第一次出現的位置,如:
public class TestReplace {
public static void main(String[] args) {
String str1="javaIsiajavajavvajfjava ";
System.out.println("輸出原字串:"+str1);
String str2=str1.replaceFirst("java","c++");
System.out.println("修改後的字串:"+str2);
}
}
輸出結果:輸出原字串:javaIsiajavajavvajfjava
修改後的字串:c++Isiajavajavvajfjava
public String replaceAll(String str1,String str2)被歸類為去除字串中的空格的方法,但是我認為,它和replace()方法無異,它也可以用於字串的替換工作。
去除字串中的空格的方法還有trim()方法,public String trim()方法只去除字串頭尾兩處的空格,對於夾在字串中的空格不做處理,比如定義一個字串str1=" java java java ",呼叫str1.trim()方法之後就會變成"java java java"。如果我們呼叫str1.replaceAll(" ","")方法,最後的輸出結果將是“javajavajava“。
還有另一種方法用於去除字串的空格,就是使用StringTokenizer來對字串進行分割和追加,以達到去除字串的目的:
import java.util.StringTokenizer;
public class TestString {
public static void main(String[] args) {
String str1=" I love java ";
StringTokenizer str2=new StringTokenizer(str1," "); //對字串進行分割
StringBuilder str3=new StringBuilder(); //建立字串快取器
while(str2.hasMoreTokens()) {
str3.append(str2.nextToken()); //追加字串
}
System.out.println(str3);
}
}
4.比較字串
對字串的比較,使用equals()和equalsIgnoreCase()兩個方法。public boolean equals(Object obj)方法比較的是字串的內容,它區分大小寫,而”==“操作符比較的僅僅是兩個物件的記憶體地址,與兩個字串物件的字元內容無關。public boolean equalsIgnoreCase(Object obj)也是比較字串物件的記憶體地址,不過,它是不區分大小寫的,如下面的程式碼例項:
public class TestString {
public static void main(String[] args) {
String str1=new String("I love java");
String str2=new String("I love java");
String str3=new String("I LOVE JAVA");
String str4=str1;
System.out.println("str1==str2: "+(str1==str2));
System.out.println("str1==str4: "+(str1==str4));
System.out.println("str1 equals str2: "+(str1.equals(str2)));
System.out.println("str1 equals str3: "+(str1.equals(str3)));
System.out.println("str1 equalsIgnoreCase str3: "+(str1.equalsIgnoreCase(str3)));
}
}
輸出結果: str1==str2: false
str1==str4: true
str1 equals str2: true
str1 equals str3: false
str1 equalsIgnoreCase str3: true
記憶體圖:
由圖中可以看到,str1和str4指向同一個物件,因此他們的記憶體地址相同。
但是,如果我們是這樣建立字串的,結果就會有所不同:
public class TestString {
public static void main(String[] args) {
String str1="I love java"; //注意此處不使用new
String str2="I love java";
String str3="I LOVE JAVA";
String str4=str1;
System.out.println("str1==str2: "+(str1==str2));
System.out.println("str1==str4: "+(str1==str4));
System.out.println("str1 equals str2: "+(str1.equals(str2)));
System.out.println("str1 equals str3: "+(str1.equals(str3)));
System.out.println("str1 equalsIgnoreCase str3: "+(str1.equalsIgnoreCase(str3)));
}
}
輸出結果為: str1==str2: true
str1==str4: true
str1 equals str2: true
str1 equals str3: false
str1 equalsIgnoreCase str3: true
要注意使用new和不使用new建立字串的區別。
5、大小寫字母轉換
將大寫字母轉換為小母使用public String toLowerCase(String str),將小寫字母轉換為大寫字母則使用public String toUpperCase(String str),對於非字母型別的字串,toLowerCase()和toUpperCase()不會進行任何轉換。