黑马程序员技术交流社区

标题: ==和equals 我不大理解 [打印本页]

作者: 黑马肖凯骏    时间: 2012-3-6 15:38
标题: ==和equals 我不大理解
本帖最后由 黑马肖凯骏 于 2012-3-6 17:47 编辑

int a=3,b=3;
return a==b  为true
String a=new String(c)
String b=new String(c)
a==b 为false
上面上都是3,下面内容都是c

可不可以这样理解,数值3只在堆内存中有一个,而a和b都指向了同一个堆内存
而下面的引用因为用到了NEW关键字 所以内存中是两个位置,a==b比较的实际上是内存地址

而equals  毕老师的操作是可以比较内容的,equals我不大理解,

请高手帮我判断一下我上面判断的是否正确呢?


感谢各位帮我解答,我已经弄明白是什么情况了!那么我再来解释一下吧!

"hello".equals("hello") 从这句话可以看出,对于String类型的"hello"就可以看做是一个匿名对象,而这个"hello"匿名对象调用了String中特有的equals()方法

然后才有了结果为true  

综上所述==  和 equals   在String情况下的用法是不一样的!
作者: 王思兰    时间: 2012-3-6 15:42
http://bbs.itheima.com/thread-8085-1-1.html有解释
作者: 吕猛    时间: 2012-3-6 15:45
http://bbs.itheima.com/forum.php ... amp;extra=#pid44823

今天刚有同学说道这个问题!
作者: 倪鹏博    时间: 2012-3-6 16:03
首先,int a=3,b=3;//a和b都是在栈内存之中的,进行a==b判断的时候,比较的是对应的值,相当于                               、、、、、、、、、、、,,,,,,,,,,,,3==3,所以这句的返回值是true;
而第二个false,你的理解是正确的!
其他的内容楼上正解!
作者: 黑马—王宁    时间: 2012-3-6 16:59
上面的是在栈内存中存储的确定值,而后面那个是对象,是在堆内存中,但a b 存储的是地址值。因此答案是一个true 一个是false
作者: 黑马—王宁    时间: 2012-3-6 16:59
我是这样认为的,如果有不对,请后来的高手给解释下。谢谢
作者: 李涛涛    时间: 2012-3-6 17:18
首先指出,你的代码有错误,String a=new String(c);这样的写法是错误的。理应为:String a=new String("c");
其次,==,比较的是两个变量的值是否相等,对于引用型变量,是则判断它们的地址是是否相同
       equals比较的是两个对象中的内容是否相同。或者说是两个变量是否是对同一对象的引用。
最后,
作者: liumeng    时间: 2012-3-6 17:29
public boolean equals(Object obj)指示其他某个对象是否与此对象“相等”。
equals 方法在非空对象引用上实现相等关系:

自反性:对于任何非空引用值 x,x.equals(x) 都应返回 true。
对称性:对于任何非空引用值 x 和 y,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 才应返回 true。
传递性:对于任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true,并且 y.equals(z) 返回 true,那么 x.equals(z) 应返回 true。
一致性:对于任何非空引用值 x 和 y,多次调用 x.equals(y) 始终返回 true 或始终返回 false,前提是对象上 equals 比较中所用的信息没有被修改。
对于任何非空引用值 x,x.equals(null) 都应返回 false。
Object 类的 equals 方法实现对象上差别可能性最大的相等关系;即,对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true(x == y 具有值 true)。

注意:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。


参数:
obj - 要与之比较的引用对象。
返回:
如果此对象与 obj 参数相同,则返回 true;否则返回 false。
另请参见:
hashCode(), Hashtable

作者: 黑马肖凯骏    时间: 2012-3-6 17:40
倪鹏博 发表于 2012-3-6 16:03
首先,int a=3,b=3;//a和b都是在栈内存之中的,进行a==b判断的时候,比较的是对应的值,相当于           ...

谢谢,我已经弄明白了,String是一个类本类!

在String中==是用来比较地址值的!
作者: 黑马肖凯骏    时间: 2012-3-6 17:41
李涛涛 发表于 2012-3-6 17:18
首先指出,你的代码有错误,String a=new String(c);这样的写法是错误的。理应为:String a=new String("c" ...

嗯,您说得很明白! 谢谢,我现在弄懂了!
作者: 黑马肖凯骏    时间: 2012-3-6 17:43
黑马—王宁 发表于 2012-3-6 16:59
上面的是在栈内存中存储的确定值,而后面那个是对象,是在堆内存中,但a b 存储的是地址值。因此答案是一个 ...

嗯 String是一个类,a,b指向了这两个,所以他们是两个不同的地址值,在String中,==是用来比较地址值的




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2