前言
正文
String s = "hello" + "world";
问:创建了几个对象?
答案:1个
原因: jvm编译期整合成 String s = "helloworld" 了,直接存于常量池中。
String str = "a" + new String("b");
问:创建了几个对象?
答案:5个
原因: 常量池中有a和b,堆中有new的b和ab,还有StringBuilder对象。
PS:字符串相加+,实际上最后会转换成new builder().append()的形式
问:以下代码输出结果
String str1 = new StringBuilder("计算机").append("软件").toString();
String str2 = new StringBuilder().append("1234").toString();
String str3 = new StringBuilder("123").append("asd").toString();
String str4 = new StringBuilder("ja").append("va").toString();
System.out.println(str1==str1.intern());
System.out.println(str2==str2.intern());
System.out.println(str3==str3.intern());
System.out.println(str4==str4.intern());
PS:
intern():
当常量池中不存在"abc"这个字符串的引用,将这个对象的引用加入常量池,返回这个对象的引用。
当常量池中存在"abc"这个字符串的引用,返回这个对象的引用。
答案:
true
false
true
false
原因: