初露寒秋 2014-09-24 14:41
浏览 219
已采纳

string两个引用相等判断true/false原因求解

(1)String s1 = "a" +"b";
String s2 = "ab"; 
System.out.println(s1 == s2);

(2)String s = "a";
String s1 = s +"b";
String s2 = "ab"; 
System.out.println(s1 == s2);
结果
(1)true
(2)false
我不知道原因啊,为什么会是这样的结果呢,求解?
  • 写回答

7条回答 默认 最新

  • xieyu_zy 博客专家认证 2014-09-26 00:17
    关注

    这个帖子有人回答了,JVM编译时等都OK了,我再复制一份我在另一个帖子的说法吧!我也希望@静夜独窗 不要在问题贴里面发这些内容了,因为这样会影响大家正常的交流,这些问题如果从点上去较真,本身就输了。

    关于这个问题并不是本书的重点,我们只是通过这个小话题展开一些探讨和思考,逐步理解更多的东西。

    关于@williamhoward 提到的问题,我说下,hashCode一样不代表值一样,样章当中也有提到,简单说呢String的hashCode并不是和它的地址或标志位相关的,而是与它存储的字符有关系,因为String已经重写了原始的hashCode方法,原始的hashCode值是对象头部部分二进制位的数字信息,可以在一定程度上标志对象,但不是地址,重写后的hashCode具体由用户决定,这也在Hash相关的算法中,如hashMap、HashSet、ConcurrentHashMap里面有用到,这几个对象里面用它的方式也差不多,尤其是HashSet就是对HashMap的包装,呵呵,你自己写一个算法要用它也行,细节不多说了,或许可以看下样章,里面有一些解释,呵呵!

    @静夜独窗 这个问题的关键是Hotsport VM编译时的合并,然后在字节码文件中就已经是一个常量了,到真正运行时,自然string_table中是同一块空间,引用不论来自那里,保存的地址都是同一个。另外,这些内容在JDK 1.6及以下的版本是在所谓的永久代的常量池中,但是JDK 1.7以上的版本就不是了,是在堆当中,在一些字符串的处理上会有所区别,有些结果也会发生改变(书的光盘中有一个testForJDK17的代码,如果运行在1.7的环境可以试下),所以为结果较真没多大用途,它也在不断变化,这个话题只是一个小引导,我希望你学会一种不断去了解问题内在的习惯,有些东西需要迭代去思考和探讨就不断清晰了,如果一味为这个结果来扣的话,可能会扣得走火入魔,呵呵!这没多大必要,因为你我都不是虚拟机的编写者,有太多的细节,有太多的版本,有太多的改变了。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(6条)

报告相同问题?

悬赏问题

  • ¥15 用windows做服务的同志有吗
  • ¥60 求一个简单的网页(标签-安全|关键词-上传)
  • ¥35 lstm时间序列共享单车预测,loss值优化,参数优化算法
  • ¥15 基于卷积神经网络的声纹识别
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 一直显示正在等待HID—ISP