求教大神两个关于String常量的程序输出问题!

xcj20 2014-02-12 02:50:12


这个程序输出的是true

这个输出的是false ,求这两个程序各自对字符串常量的赋值方式为什么使结果不一样?
...全文
204 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
ningbohezhijun 2014-02-12
  • 打赏
  • 举报
回复
我的理解是这样的: 第一个例子输出为true,是因为第一种写法在编译期间就可以确定String s的值了,因为A,B都是用final修饰的。所以String s会放到常量池 而第二个例子中A,B都是放在静态初始化块中的,静态初始化块是当这个类第一次被JVM加载的时候执行的。 而第一次被JVM加载是运行时的时候了,所以不会放到常量池中。所以为false.
若鱼1919 2014-02-12
  • 打赏
  • 举报
回复
javap看一下字节码就知道怎么回事了
raistlic 2014-02-12
  • 打赏
  • 举报
回复
引用 5 楼 lingang0607 的回复:
第一个在编译期就已确定了,第二个只能通过运行后才能确定,所以是两个全新的对象
+1 http://www.coderanch.com/t/454384/java/java/compile-time-constant
微笑生活LG 2014-02-12
  • 打赏
  • 举报
回复
第一个在编译期就已确定了,第二个只能通过运行后才能确定,所以是两个全新的对象
oh_Maxy 2014-02-12
  • 打赏
  • 举报
回复
好绕啊。。 个人的简单理解是这样的: 第一个情况是因为在执行静态方法main的时候,常量A、B明确,因此等同于"ab"+"cd"操作。 第二个情况,在执行静态方法main的时候,常量A、B不明确,通过执行static静态块的时候得到,此时A、B被当做变量处理了,效果等同于: String A = "ab"; String B = "cd"; String s = A+B; ...
枫醉秋 2014-02-12
  • 打赏
  • 举报
回复
第二个 就是两个全新的对象了,肯定是false了
枫醉秋 2014-02-12
  • 打赏
  • 举报
回复
第一个true的原因是 字符常量取已经存在了 abcd的对象。在String t="abcd";的时候就不会再创建新的对象所以两个引用是相等的。
shijun199006 2014-02-12
  • 打赏
  • 举报
回复
其实它们输出的值是一样的,只是比较的方法不一样,导致一个是true一个是false,用equals比较的话,输出的都是true

62,614

社区成员

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

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