对于String对象的问题,希望大家指导我一下!

_LittleMing 2014-03-11 09:12:15
String s1 = "a";
String s2 = s1 + "b";
String s3 = "a" + "b";
System.out.println(s2 == "ab");
System.out.println(s3 == "ab");
第一条语句打印的结果为 false,第二条语句打印的结果为 true


这是为什么啊?
...全文
170 7 打赏 收藏 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
多木多多木 2014-03-12
  • 打赏
  • 举报
回复
这个得从内存的角度考虑。ab这个字符串第一次出现时,String池中是没有这个东东的,接下来被加载到String池中,s3就在这里找到。所以结果是false和true。
代码间的舞者 2014-03-11
  • 打赏
  • 举报
回复
嗯。 S1和S3都放在常量池,在编译的时候就存在class文件中。 S2要在运行时是才能读出来。
_LittleMing 2014-03-11
  • 打赏
  • 举报
回复
引用 4 楼 gaofuqi 的回复:
打错字了。。。。 String s1 = "a"; String s2 = s1 + "b"; //编译后s2=new StringBuilder.append("a").append("b").toString();,这是在堆上分配,s2引用的是堆上的"ab" String s3 = "a" + "b"; //编译后s3="ab",在常量池,s3引用的常量池的"ab";
恩恩!明白了,谢谢你!
gaofuqi 2014-03-11
  • 打赏
  • 举报
回复
打错字了。。。。 String s1 = "a"; String s2 = s1 + "b"; //编译后s2=new StringBuilder.append("a").append("b").toString();,这是在堆上分配,s2引用的是堆上的"ab" String s3 = "a" + "b"; //编译后s3="ab",在常量池,s3引用的常量池的"ab";
gaofuqi 2014-03-11
  • 打赏
  • 举报
回复
引用 2 楼 limitvic 的回复:
[quote=引用 1 楼 gaofuqi 的回复:] 编译器的优化: String s1 = "a"; String s2 = s1 + "b"; //编译后s2=StringBuilder.append("a").append("a").toString(); String s3 = "a" + "b"; //编译后s3="ab";
那为什么System.out.println(s2 == "ab");是false啊[/quote] String s1 = "a"; String s2 = s1 + "b"; //编译后s2=new StringBuilder.append("a").append("a").toString();,这是在对上分配s2引用的是堆上的"ab" String s3 = "a" + "b"; //编译后s3="ab",在常量池,s3引用的常量池的"ab";
_LittleMing 2014-03-11
  • 打赏
  • 举报
回复
引用 1 楼 gaofuqi 的回复:
编译器的优化: String s1 = "a"; String s2 = s1 + "b"; //编译后s2=StringBuilder.append("a").append("a").toString(); String s3 = "a" + "b"; //编译后s3="ab";
那为什么System.out.println(s2 == "ab");是false啊
gaofuqi 2014-03-11
  • 打赏
  • 举报
回复
编译器的优化: String s1 = "a"; String s2 = s1 + "b"; //编译后s2=StringBuilder.append("a").append("a").toString(); String s3 = "a" + "b"; //编译后s3="ab";

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧