String對象創建後則不能被修改,是不可變的,所謂的修改其實是創建了新的對象,所指向的內存空間不同。如
下圖所示:

運行結果:

結合上面的代碼,關於字符串必須要了解的:
1)通過String s1="愛慕課"; 聲明了一個字符串對象, s1存放了到字符串對象的引用,在內存中的存放引用關系如
下圖所示:

然後通過s1="歡迎來到:"+s1; 改變了字符串s1 ,其實質是創建了新的字符串對象,變量s1指向了新創建的字符
串對象,如下圖所示:

2)一旦一個字符串在內存中創建,則這個字符串將不可改變。如果需要一個可以改變的字符串,我們可以使用
StringBuffer類或者StringBuilder類。
3) 每次 new 一個字符串就是產生一個新的對象,即便兩個字符串的內容相同,使用 "==" 比較時也為 ”false” ,如
果只需比較內容是否相同,應使用 "equals()" 方法。s3和s4 都是通過new 在堆內存中創建的新對象,有各自的地址,
而==比較的就是地址,所以為false。
實例:
public class Test {
public static void main(String[] args) {
String s1 = "imooc";
String s2 = "imooc";
//定義字符串s3,保存“I love”和s1拼接後的內容
String s3="I love"+s1;
// 比較字符串s1和s2
// imooc為常量字符串,多次出現時會被編譯器優化,只創建一個對象
System.out.println("s1和s2內存地址相同嗎?" + (s1 == s2));
//比較字符串s1和s3
System.out.println("s1和s3內存地址相同嗎?" +(s1==s3));
String s4 = "I love " + s1;
//比較字符串s4和s3
// s1是變量,s4在運行時才知道具體值,所以s3和s4是不同的對象
System.out.println("s3和s4內存地址相同嗎?" + (s4 == s3));
}
}
編譯運行結果:

解釋:
S1是將字符串存在常量池中,所以它的地址是常量池給的。同樣S2也是常量池給的地址,地址都是字符串常
量"imooc"的地址,所以s1和s2的地址是一樣的。然而s3是一個常量加上一個變量,因此是存在堆內存中,這個地址
是堆內存新給s3的。同理,s4的地址也是堆內存給他的。因此s3和s4的內存地址是不一樣的。
String 類提供了許多用來處理字符串的方法,例如,獲取字符串長度、對字符串進行截取、將字符串轉換為大寫
或小寫、字符串分割等。
結合代碼來熟悉一下方法的使用:
public class Test{
public static void main(String[] args){
String s1 = "sun java";
String s2 = "sun Java";
System.out.println(s1.charAt(1));//u
System.out.println(s2.length());//8
System.out.println(s1.indexOf("java"));//4
System.out.println(s1.indexOf("Java"));//-1
System.out.println(s1.equals(s2));//false
System.out.println(s1.equalsIgnoreCase(s2));//true
String s = "我是程序員,我在學java";
String str = s.replace('我','你');
System.out.println(str);
}
}
運行結果:


實例代碼:
public class Test{
public static void main(String[] args){
String s = "Welcome to Java World!";
String s1 = " sun java ";
System.out.println(s.startsWith("Welcome"));//true
System.out.println(s.endsWith("World"));//false
String sL = s.toLowerCase();
String sU = s.toUpperCase();
System.out.println(sL);
System.out.println(sU);
String subs = s.substring(11);
System.out.println(subs);
String sp = s1.trim();
System.out.println(sp);
}
}
運行結果:
注意事項:
1)字符串s2中字符的索引從0開始,范圍為 到str.length()-1。
2)使用indexOf進行字符或字符串查找時,如果匹配返回位置索引;如果沒有匹配結果,返回-1。
3)使用substring(beginIndex , endIndex)進行字符串截取時,包括beginIndex位置的字符,不包括endIndex位置的
字符。
靜態重載方法
public static String valueOf(...)可以將基本類型轉換為字符串
例如:
public static String valueOf(double d) public static String valueOf(int i)
方法public String[] split(String regex)可以將一個字符串按照指定的分隔符分割,返回分割後的字符串數組。
實例代碼:
public class Test{
public static void main(String[] args){
int j = 1234567;
String sNumber = String.valueOf(j);
System.out.println("j 是"+sNumber.length()+"位數");
String s = "Mary,F,1976";
String[] split = s.split(",");
for(int i=0;i
運行結果:

九String類中的"=="和equals()的異同
1)==: 判斷兩個字符串在內存中首地址是否相同,即判斷是否是同一個字符串對象。
2)equals(): 比較存儲在兩個字符串對象中的內容是否一致。
這兩個的用法我們在前面已經多處的用到,在這裡就不再詳細舉例說明他們的異同