回答一下上面一个人的问题,问题是“”String s3 = new String("12") + new String("34");
s3.intern();
String s4 = "1234";
System.out.println(s3 == s4);//true
求解,为什么在第二段比较中会返回true,从字节码看s3应该就是生成了一个stringbuilder对象完成连接操作后执行了toString, s3不是应该仍然是堆内的对象地址吗?为什么会和常量池中的地址相等?“”
我之前也是不明白s3为什么等于s4,查了下资料,说是在jdk1.7之后,如果字符串在堆中有实例,那intern方法就会把这个字符串的引用放在字符串常量池里,所以,String s3 = new String("12") + new String("34");这里在字符串常量池里放了一个字符串“12”,一个字符串“34”,在堆里存放他们的运算结果“1234”,然后把“1234”的引用返回给s3,
s3.intern()这段代码运行时,jvm在堆里先到了字符串“1234”,所以就会把他的引用放到字符串常量池里,这个引用和s3相等,
String s4 = "1234";这个代码时,会把字符串常量池里“1234”的引用返回给s4,所以s3是等于s4的,
个人理解,如有不对,请指正,谢谢😜
展开