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);}
}