“我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第n篇文章,点击查看活动详情”
考察String类两种创建方式以及考察equals方法和==的区别
public class StringExercise01 {
public static void main(String[] args) {
String a="lxw";
String b= "lxw";
//小李解读:
//String类重写了Object类的equals方法,比较的是字符串内容,a.equals(b) 输出结果是 true
System.out.println(a.equals(b));
//String a="lxw" 在常量池创建 lxw空间,执行 String b= "lxw"时候,会在常量池中找,是否存在
// lxw的空间,发现有就把lxw的池空间指向了b,a==b 输出结果 true
System.out.println(a == b);
String x="lxw";//指向常量池的地址
String y =new String("lxw");//指向堆中的对象
//解读: String x="lxw" x指向常量池的地址空间
//String y =new String("lxw"); 最终指向的是堆中value[] 数组属性的地址,指向堆地址
//x.equals(y) 比较的是字符串内容,输出结果是true
System.out.println(x.equals(y));
// x == y 比较的是空间地址 x指向常量池中的地址,y指向堆中value[]属性地址
//x == y 输出结果 false
System.out.println(x == y);
//String类的intern方法
//参考jdk的方法说明,总结一句话 intern()返回的是常量池的地址(对象)
//解读分析:x指向常量池的内存地址 y.intern()返回的也是常量池地址
//x == y.intern() 输出结果true
System.out.println(x == y.intern());
//解读:y指向堆中内存地址 y.intern()返回的也是常量池地址
// y == y.intern() 输出结果false
System.out.println(y == y.intern());
}
}
考察String创建原理
public class StringExercise03 {
public static void main(String[] args) {
String s1="haha";
s1="lxw";
// 以上的代码一共创建了两个对象,分别是常量池对象 haha 和lxw
String a="hello"+"abc";
//javm 虚拟机,编译器会把上面的优化为:String a="helloabc",所以就创建了一个对象
String aa="hello";
String bb="abc";
String cc=aa+bb;
//解读 String cc=aa+bb 代码底层执行的步骤
//1.先创建一个 StringBuilder sb=new StringBuilder();
//2.执行 sb.append("hello");
//3.执行 sb.append("abc");
//4.执行 String cc=sb.toString()
//其实最后cc 指向堆中的对象(String)value[]--->池中"helloabc"
// String cc=aa+bb; 一共创建3个对象
}
}
总结:
String c1="ab"+"cd" 字符串常量相加,看的是池。
String c1=a+b;变量相加,是在堆内。