java8中的‘+‘的使用注意事项
问题由来
前几天看了道java基础面试题,试着做了一下,居然还做错了,找了一下原因,涨了一下姿势,看样子也是基础不牢固,都忘了还有这档子事情了,这里简单记录一下。
代码如下:
public static void main(String[] args) {String s1 = "ILoveJava";String s2 = new String("ILoveJava");String s3 = "ILove";String s4 = "Java";String s5 = "ILove" + "Java";String s6 = s3 + s4;final String s7 = "ILove";final String s8 = "Java";String s9 = s7 + s8;System.out.println("s1和s2是否相同:" + (s1 == s2));System.out.println("s1和s5是否相同:" + (s1 == s5));System.out.println("s1和s6是否相同:" + (s1 == s6));System.out.println("s1和s9是否相同:" + (s1 == s9));}
打印的结果为:
// s1和s2是否相同:false
// s1和s5是否相同:true
// s1和s6是否相同:false
// s1和s9是否相同:true
总结
当时以为s1和s6是相等的,没想到还有个编译期常量拼接和运行期变量拼接。
1、编译期常量拼接(如 “a” + “b”、final 变量拼接):编译器会直接优化为拼接后的结果,存入字符串常量池。
2、运行期变量拼接(如非 final 变量、对象引用):底层通过 StringBuilder(或 StringBuffer)的 append() 方法实现,最后调用 toString() 生成新字符串(存储在堆中)。
