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(): 比較存儲在兩個字符串對象中的內容是否一致。
這兩個的用法我們在前面已經多處的用到,在這裡就不再詳細舉例說明他們的異同