如果内置的equals方法是比较地址的,为什么两个相同的字符串地址会不相等呢?

如果内置的equals方法是比较地址的,为什么两个相同的字符串地址会不相等呢?

如题,bobo这字符串在内存里不应该是相同地址么?java的机制是每新建一个字符串都开辟一个新地址即使这个字符串已经在内存里有了?

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
liuyubobobo 2023-05-18 22:19:27

我没有很理解你的问题。两个相同的字符串当然你可能地址不同,因为不同的地址里可以存储相同的字符串(就像不同的地址可能存储相同的数字。)


对于 Java 的字符串,可能真正会困惑的是,对于 == 操作,本来应该是比较地址,但在一些情况下,明明看起来地址不同,== 可能会返回 true。比如以下代码,理论上 x 和 y 不是一个地址,应该返回 false,但实际上可能会返回 true。


String x = "abc", y = "abc";
System.out.println(x == y); // 大概率返回 true


其原因在于,JVM 对这段代码做了优化,检测到了 y 和 x 值相同,所以先让 y 指向和 x 一样的位置,在需要的时候再分配内存给 y,使用了延迟的思想(lazy),这个课程后续介绍一些算法也会用这个思想。但这是不可靠的,在另外一些时候,这个优化不起作用。比如下面的代码,x 和 y 的值依然相同,但 x == y 就返回 false 了。


String x = "abc";
x = x + "1234567890";

String y = "abc";
y = y + "1234567890";

System.out.println(x == y); // 大概率返回 false


所以,原则,只要地址比较用 ==,值比较用 equals 就好。如果自定义的类需要自定义值比较,需要覆盖 equals 方法。


在上面的两个例子中,x.equals(y) 永远返回 true。


继续加油!:)

  • 提问者 牧鱼儿 #1
    额,我写python的,java不咋熟,python里对于字符串,只要值相同,内存地址应该也是相同的,所以这里应该是我语言的基础问题,谢谢老师
    2023-05-18 22:55:34
  • liuyubobobo 回复 提问者 牧鱼儿 #2

    python 字符串的 == 就是值比较;python 的地址比较是 is

    2023-05-19 02:12:48
  • Java的多态

    2023-09-18 23:21:40
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
算法与数据结构
  • 参与学习       2589    人
  • 解答问题       1090    个

慕课网算法名师Liuyubobobo,5年集大成之作 从0到工作5年,算法与数据结构系统解决方案

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师