如图,p1.name是p1中的一块空间,它有自己的地址,但是它里面的内容存放的是常量池中“hspedu”的地址。

如图,p1.name是p1中的一块空间,它有自己的地址,但是它里面的内容存放的是常量池中“hspedu”的地址。
而==在比较引用类型时又是比较地址相不相同,而不是内容相不相同哇,那这里不应该是false吗,为什么还是true

img

字符串常量 在第一次创建时会生成一个String实例对象, 后面再次引用 都是同一个 常量 String对象,所以 这个两个String 引用p1.name 和 p2.name指向的都是同一个实例对象,用 == 也返回true

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    答案:

    根据给出的问题描述,无法提供图示信息。但是根据问题描述,似乎已经给出了答案,即应该得到的结果是false,因为==操作符在比较引用类型时比较的是地址,而非内容。

    如果实际上得到了true,那么很可能是因为在创建p1对象时,name属性被赋值为"hspedu"。在Java中,字符串常量(包括"hspedu")被当做引用类型处理,被存储在字符串常量池中,因此每次使用相同的字符串常量创建对象时,都会指向同一个地址,也就是说,作为字符串常量的"hspedu"和p1.name指向的是同一个地址,因此比较结果是true。

    如果想要比较p1.name的内容和"hspedu"是否相等,应该使用.equals()方法,而不是==操作符。例如:

    if (p1.name.equals("hspedu")) {
        // do something
    }
    

    这样可以比较字符串的内容是否相等,而不是比较地址是否相等。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

==在java里面只能比对象引用,和字面值完全无关,常量自然相等,才是==