1. 程式人生 > >Java —— String類

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