Java —— String類
1.String類的兩種例項化方式
-
直接賦值
-
傳統方法(構造方法例項化)
程式碼示例:
public class Test14{
public static void main(String[] args){
//直接賦值,在堆上分配空間
String str1="hello";
//通過構造方法例項化String物件
Stirng str2= new String("aloha");
}
}
2.字串相等比較
比較字串內容,必須採用String類提供的equals方法。
public boolean equals(String anotherString)
程式碼示例:
public class Test14{
public static void main(String[] args){
String str1="hello";
String str2=new String("hello");
//String是引用型別,str1和str2存放的是地址
//==比較值,str1==str2就是比較str1和str2的地址
System.out.printn(str1==str2);
//equals方法比較字串內容
System.out.printn(str1.equals(str2));
}
}
執行結果:
3.String的匿名物件
字串常量("")是String的匿名物件
- 匿名物件一定儲存在堆記憶體中
- 在開發中,如果判斷使用者輸入的字串是否等同於特定字串,一定將特定字串(String常量)寫在前面,避免NullPointerException
public class Test14{ public static void main(String[] args){ //假設str2由使用者輸入,若使用者不輸入 String str2 = null; System.out.println("hello".equals(str2)); //false //str2物件不存在 System.out.println(str2.equals("hello")); //空指標異常 } }
4.例項化區別
-
4.1 直接賦值
若賦的值相等,則直接賦值並不會開闢新的堆記憶體空間
public class Test14{
public static void main(String[] args){
String str1 = "hello";
String str2 = "hello";
String str3 = "hello";
System.out.println(str1==str2); //true
System.out.println(str2==str3); //true
System.out.println(str1==str3); //true
}
}
- 原因:
JVM底層會自動維護一個字串的物件池(物件陣列),若採用直接賦值的形式進行String的物件例項化,該物件會自動儲存在該物件池中。如果下次繼續使用直接賦值的模式宣告String物件,此時物件池中若有指定內容,則直接使用;若沒有,則開闢新的堆空間後將其儲存在物件池中,供下次使用。
-
4.2 構造方法例項化
構造方法例項化會開闢兩塊堆記憶體空間,並且其中一塊堆記憶體將成為垃圾空間。
- 手工入池:
public native String intern( ) ; 本地方法,沒有方法體
程式碼示例:
public class Test14{
public static void main(String[] args){
String str1 = "hello";
String str2=new String("hello").intern();
System.out.println(str1==str2); //true
}
}
以上述程式碼為例,str2中的"hello"會開闢一個空間,new String()也會開闢一個空間。當手工入池時,是將new String()入池。
5.字串常量不可變更
字串一旦定義後不可改變,變更的只是引用,不是內容——如果對字串的內容進行改變,就會開闢一個新的堆記憶體空間存放變更後的字串內容,並非在原對記憶體空間直接改變字串內容。
程式碼示例:
public class Test14{
public static void main(String[] args){
String str1 = "hello"; //開闢一個堆記憶體空間
//world開闢一個,!開闢一個,helloworld開闢一個,helloworld!開闢一個
System.out.println(str1+"world"+"!");
}
}
6.字元與字串的相互轉換
-
6.1 字元陣列 —> 字串
//1.
public String(char[] value)
//2.
public String(char[] value,int offset,int count)
程式碼示例:
public class Test14{
public static void main(String[] args){
char[] ch = new char[]{'b','o','n','j','o','u','r','!'};
String str = new String(ch);
System.out.println(str); //bonjour!
String str1 = new String(ch,2,5);
System.out.println(str1); //njour
}
}
-
6.2 字串 —> 單個字元
public char charAt(int index);
程式碼示例:
public class Test14{
public static void main(String[] args){
char c = "bonjour".charAt(3);
System.out.println(c); //j
//c -> int型別 -> c+32
System.out.println(c+32); //138
}
}
-
6.3 字串 —> 字元陣列
public char[] toCharArray();
- 取得長度,陣列是屬性,字串是方法
程式碼示例:
public class Test14{
public static void main(String[] args){
char[] ch = "bonjour".toCharArray();
//length
System.out.println(ch.length); //7
System.out.println("bonjour".length()); //7
}
}
7.位元組與字串的相互轉換
-
7.1 位元組陣列 —> 字串
//1.
public String(byte[] value)
//2.
public String(byte[] value,int offset,int count)
程式碼示例:
public class Test14{
public static void main(String[] args){
byte[] data = new byte[]{2,4,6,8};
String str = new String(data);
System.out.println(str);
String str1 = new String(data,2,2);
System.out.println(str1);
}
}
-
7.2 字串 —> 位元組陣列
public byte[] getBytes();
程式碼示例:
public class Test14{
public static void main(String[] args){
String str = "hello";
byte[] data = str.getBytes();
for(int i=0;i<data.length;i++){
System.out.println(data[i]); //104 101 108 108 111
}
}
}
-
7.3 字串 —> 位元組陣列(按照指定編碼)
public byte[] getBytes(String charsetName)
程式碼示例:
public class Test14{
public static void main(String[] args)throws Exception{
String str = "唱歌";
byte[] data = str.getBytes("gdk");
for(int i=0;i<data.length;i++){
System.out.println(data[i]);
}
System.out.println(new String(data));
}
}
8.字串的比較
-
8.1 不區分大小寫相等比較
public boolean equalsIgnoreCase(String anotherString)
-
8.2 區分大小寫相等比較
public boolean equals(String anotherString):
程式碼示例:
public class Test14{
public static void main(String[] args){
System.out.println("hello".equalsIgnoreCase("Hello")); //true
System.out.println("hello".equals("Hello")); //false
}
}
-
8.3 比較兩個字串大小
public int compareTo(String anotherString)
a.返回大於0:表示大於比較物件
b.返回小於0:表示小於比較物件
c.返回等於0:兩者相等
程式碼示例:
public class Test14{
public static void main(String[] args){
String str1 = "hello";
String str2 = "HEllo";
System.out.println(str1.compareTo(str2)); //32
System.out.println(str2.compareTo(str1)); //-32
System.out.println(str2.compareTo(str2)); //0
}
}
9.字串查詢
-
9.1 判斷str在本字串中是否存在
public boolean contains(String str)
程式碼示例:
public class Test14{
public static void main(String[] args){
String str1="hello world";
String str2="world";
System.out.println(str1.contains(str2)); //true
System.out.println(str2.contains(str1)); //false
}
}
-
9.2 判斷是否以指定字串開頭
public boolean startsWith(String str)
-
9.3 判斷是否以指定字串開頭(從指定位置開始)
public boolean startsWith(String str,int index)
程式碼示例:
public class Test14{
public static void main(String[] args){
String str1="hello world";
String str2="world";
String str3="hel";
System.out.println(str1.startsWith(str2)); //false
System.out.println(str1.startsWith(str3)); //true
System.out.println(str1.startsWith(str2,6)); //true
}
}
-
9.4 判斷是否以指定字串結尾(用法同9.2)
public boolean endsWith(String str)
-
9.5 從頭開始查詢指定字串的位置
public int indexOf(String str)
- 如果內容重複,只返回查詢的第一個位置
程式碼示例:
public class Test14{
public static void main(String[] args){
String str1="hello world";
String str2="l";
String str3="heli";
System.out.println(str1.indexOf(str2)); //2
System.out.println(str1.indexOf(str3)); //-1
}
}
10.字串替換
//替換所有指定內容
public String replaceAll(String regwx,String replacement)
//替換指定首個內容
public String replaceFirst(String regwx,String replacement)
程式碼示例:
public class Test14{
public static void main(String[] args){
String str1="hello";
System.out.println(str1.replaceAll("l","2")); //he22o
System.out.println(str1.replaceFirst("l","3")); //he3lo
}
}
11.字串拆分
//將字串按照指定的格式全部拆分
public String[] split(String regex)
//將字串部分拆分,陣列長度為limit
public String[] split(String regex,int limit)
程式碼示例:
public class Test14{
public static void main(String[] args){
String str = "192.168.1.1";
String str1 = "C'est la vie !!!";
// .是引用,不能直接寫".",應寫成轉義字元,但由於\也有特殊含義,因此寫為\\.
String[] result = str.split("\\.");
String[] result1= str1.split(" ",2);
for(int i=0;i<result.length;i++){
System.out.print(result[i]+" ");
}
System.out.println();
System.out.println("------------------------------");
for(int i=0;i<result1.length;i++){
System.out.println(result1[i]);
}
}
}
執行結果:
12.字串擷取
//從指定位置擷取到字串結尾
public String substring(int beginIndex)
//擷取部分內容
public String substring(int beginIndex,int endIndex)
程式碼示例:
public class Test14{
public static void main(String[] args){
String str = "C'est la vie";
//左閉右開
String result = str.substring(0,5);
String result1 = str.substring(6);
System.out.println(result); //C'est
System.out.println(result1); //la vie
}
}
13.其他操作方法
-
13.1 去掉左右空格
public String trim()
程式碼示例:
public class Test14{
public static void main(String[] args){
String str = " C'est la vie ";
System.out.println("["+str+"]"); //[ C'est la vie ]
System.out.println("["+str.trim()+"]"); //[C'est la vie]
}
}
-
13.2 轉大小寫
//轉大寫
public String toUpperCase()
//轉小寫
public String toLowerCase()
程式碼示例:
public class Test14{
public static void main(String[] args){
String str = " C'est la vie ";
System.out.println(str.toLowerCase()); // c'est la vie
System.out.println(str.toUpperCase()); // C'EST LA VIE
}
}
-
13.3 判斷字串是否為空
public boolean isEmpty()
- 只能判斷是否為空字串,而不是null
程式碼示例:
public class Test14{
public static void main(String[] args){
String str = " C'est la vie ";
String str1 = "";
// System.out.println(null.isEmpty()); //空指標異常
System.out.println(str.isEmpty()); //flase
System.out.println(str1.isEmpty()); //true
//完整判斷字串是否為空
//str == null||str.idEmpty()
}
}
14.StringBuffer類
由於String不可更改的特性,為了方便字串的修改,提供StringBuffer類
-
14.1 字串連線
public StringBuffer append(各種資料型別)
程式碼示例:
public class Test14{
public static void main(String[] args){
StringBuffer str = new StringBuffer("C'est la vie");
str.append("!!! ").append("Bonjour");
System.out.println(str); //C'est la vie!!! Bonjour
}
}
- String和StringBuffer區別:
String的內容無法修改,而StringBuffer的內容可以修改。頻繁修改字串的情況考慮使用StingBuffer。
-
14.2 StringBuffer和String的相互轉換
- 14.2.1 StringBuffer —> String
呼叫StringBuffer的構造方法或append()
- 14.2.2 String —> StringBuffer
StringBuffer.toString();
-
14.3 字串反轉
public StringBuffer reverse()
程式碼示例:
public class Test14{
public static void main(String[] args){
StringBuffer str = new StringBuffer("C'est la vie");
System.out.println(str.reverse()); //eiv al tse'C
}
}
-
14.4 刪除指定範圍的資料
public StringBuffer delete(int start, int end)
程式碼示例:
public class Test14{
public static void main(String[] args){
StringBuffer str = new StringBuffer("C'est la vie");
System.out.println(str.delete(0,5)); // la vie
}
}
-
14.5 插入資料
public synchronized StringBuffer insert(int offset, 各種資料型別)
程式碼示例:
public class Test14{
public static void main(String[] args){
StringBuffer str = new StringBuffer("C'est la vie");
System.out.println(str.insert(0,"Bonjour,")); //Bonjour,C'est la vie
}
}
- StringBuffer、StringBuilder的區別:
StringBuffer——執行緒安全操作,效率較低
StringBuilder——執行緒不安全操作,效率較高,Stringde "+"操作,底層會將String —> StringBulider