String常量池面试题一则
String s1 = "a";
String s2 = "b";
String s3 = "ab";
String s4 = "a"+"b";
String s5 = s1 + s2;
System.out.println(s3==s4);
System.out.println(s4==s5);
System.out.println(s5==s3);
请问结果是什么
首先"ab"为常量,所以会被加载到运行时常量池中。
而"a"、"b"为常量加常量,结果也为常量"ab",JVM先看观察运行时常量池,发现已经有"ab",则引用它。
所以s3和s4为同一的变量。
s1和s2为字符串变量,s1+12底层为 new StringBuilder().append("a").append("b").toString()
toString()底层为 new String("ab") 所以s5是new出来的对象,放在堆中而不是运行时常量池中
所以s5和s4不是同一变量
结果为true
false
false
三个小口诀:
1.常量与常量的拼接结果在常量池。且常量池中不会存在相同内容的常量。
2.只要其中一个是变量,结果就在堆中。(s1+s2)
3.如果拼接的结果调用intern()方法,返回值就在常量池中