1.判断定义为String类型的s1和s2是否相等
String s1 = "abc"; //这个“abc”对象首先会进常量池
String s2 = "abc"; //这行会先看常量池有没有“abc”对象 没有才到栈哪里去创建 否则直接记录它
System.out.println(s1 == s2);
System.out.println(s1.equals(s2))
事实上两个输出都是为true。原因看注释。
2:这句话中创建几个对象?
String s = new String("abc");
答案:2个。一个在常量池中,一个在堆中(就是常量池的副本,上一节提到过)
3:判断真假
String s1 = new String("abc");
String s2 = "abc";
System.out.println(s1 == s2); // false (堆)==(常量池)
System.out.println(s1.equals(s2)) // true 序列一样
4:判断真假
String s1 = "a"+"b"+"c"; //在编译的时候已经是“abc“字符串了,所以放到了常量池
Sreing s2 = "abc";
System.out.println(s1 == s2); // true java中有常量优化机制
System.out.println(s1.equals(s2)) // true 序列一样
5:判断真假
String s1 = "ab";
String s2 = "abc";
String s3 = s1+"c";
System.out.println(s2 == s3); // false s2在常量池中,s3在栈中
System.out.println(s2.equals(s3)) // true 序列一样
如图所示:
这个是java api的描述 (截图了)
意思就是当有“+”的时候,底层都会new一个StringBuffer()对象,然后该对象会调用tostring()方法转换-->new String()对象。然后就有了地址。。。