String(JDK 1.8)
字符串拼接如何实现?
参考:Java String + 拼接字符串原理
String str1 = "111111";
String str2 = "222222";
String str = str1 + str2;
System.out.println(str);
String str1 = "111111";
String str2 = "222222";
StringBuilder sb = new StringBuilder();
sb.append(str1);
sb.append(str2);
String str = sb.toString();
System.out.println(str);
字符串字面量什么时候在字符串常量池创建实例对象?
参考:Java字符串字面量是何时进入到字符串常量池中的
String str1 = "str1";
String str2 = new String("str2");
String str3 = str1 + str2;
str3.intern();
String str4 = "str1str2";
String str5 = "str1" + "str2";
System.out.println(str3 == str4);
System.out.println(str3 == str5);
String s = new String("1");
s.intern();
String s2 = "1";
System.out.println(s == s2);
System.out.println(null + str1);
总结
- 只要是字符串字面量,使用时(程序执行到此处)一定会在字符串常量池创建String实例对象。
- 只要使用 new 关键字,一定会在堆区创建String实例对象。
- 字符串拼接的时候底层也使用了 new 关键字,一定会在堆区创建String实例对象。
- 若String实例对象只在堆区存在,调用 intern() 方法会将堆区String实例对象的引用存入字符串常量池。
- 遇到字符串字面量一定是在字符串常量池创建对象或获取对象引用。
- new 返回的一定是堆区的String实例对象。
- “str1” + “str2” 在编译时会被优化为 “str1str2”。
- null 在字符串拼接时会被当作"null"处理。