如果内置的equals方法是比较地址的,为什么两个相同的字符串地址会不相等呢?
如题,bobo这字符串在内存里不应该是相同地址么?java的机制是每新建一个字符串都开辟一个新地址即使这个字符串已经在内存里有了?
14
收起
正在回答 回答被采纳积分+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积分~
来为老师/同学的回答评分吧
0 星