String類


String類equals方法

String類compareTo方法

String類valueOf方法boolean參數


內存分析_字符串拼接只會在內存中開辟一個對象

內存分析_字符串new創建對象

內存分析_變量和字符串拼接字節碼執行過程

String類內存分析
package com.cn;public class test01 {public static void main(String[] args) {String s1 = "a" + "b" + "c";String s2 = "ab" + "c";String s3 = "a" + "bc";String s4 = "abc";String s5 = "abc" + "";//上面的字符串,會進行編譯器優化,直接合并成完整的字符串"abc",可以通過反編譯(編譯后的.class文件)驗證//在常量池中,常量池的特點是第一次如果沒有這個字符串,就放進去,如果有這個字符串,就直接從常量池中取//new關鍵字創建對象會在內存開辟兩個空間,在堆中開辟一個對象,在字符串常量池開辟一個字符串String str = new String("abc");//變量和字符串拼接,編譯時不知道變量是字符串,不會進行編譯器優化,執行時才進行字符串拼接String a = "abc";String b = a + "def";System.out.println(b);//文件目錄下:javap -c 文件名 解析字節碼(.class文件)執行過程//String abc 將"abc"入棧/壓棧給a//StringBuilder init(初始化) 創建一個StringBuilder對象sb,構造器內完成//sb.append(方法) sb先拼"abc",再拼"def"//sb.toString 把StringBuilder對象sb轉為String類型//打印語句}
}
StringBuilder類(源碼-內存分析)



?內存分析—StringBuilder——new對象有參(String類)構造器


內存分析—StringBuilder對象sb用append(str2)

內存分析—StringBuilder對象sb用append數組擴容過程

package com.cn;public class test01 {public static void main(String[] args) {//繼承自父類AbstractStringBuilder的兩個屬性char[] value、int countStringBuilder sb3 = new StringBuilder();//super(16)調用父類構造器,并傳入參數16,即字符數組長度為16//表面調用StringBuilder的空構造器,實際底層是對value數組進行初始化,長度為16StringBuilder sb2 = new StringBuilder(3);//表面調用StringBuilder的有參構造器,傳入參數int,實際底層是對value數組進行初始化,長度為intStringBuilder sb = new StringBuilder("abc");StringBuilder sb4 = sb.append("def");//在StringBuilder的對象的地址不變的情況下,想改變字符串是可能的,直接追加,底層改變的是sb對象的value字符數組System.out.println(sb == sb4);//true代表地址一致}
}
StringBuilder常用方法
package com.cn;public class test01 {public static void main(String[] args) {StringBuilder sb = new StringBuilder("nihao");//增sb.append("hellojava");System.out.println(sb);//刪sb.delete(3, 6);//刪除[3,6)位上的字符System.out.println(sb);sb.deleteCharAt(1);//刪除指定位置System.out.println(sb);//改 --插入sb.insert(3, ",");System.out.println(sb);//改 --替換sb.replace(4, 6, "...");//替換[4,6)位為...System.out.println(sb);sb.setCharAt(3, 's');System.out.println(sb);//查for (int i = 0; i < sb.length(); i++) {System.out.println(sb.charAt(i) + "\t");}//截取String str = sb.substring(2, 4);//截取[2,4)位,返回一個新字符串,對原字符串無影響System.out.println(str);System.out.println(sb);}
}