作者:涂鸦
链接:https://www.zhihu.com/question/26872848/answer/34357265
来源:知乎
著作权归作者所有,转载请联系作者获得授权。
链接:https://www.zhihu.com/question/26872848/answer/34357265
来源:知乎
著作权归作者所有,转载请联系作者获得授权。
通俗点讲,==是看看左右是不是一个东西。equals是看看左右是不是长得一样。
如何记住嘛。如果单纯是想记住,
==:等于。
equals:相同。
两个长得一样的人,只能说长的相同(equals),但是不等于他们俩是一个人。你只要记住equals,==就不用记了。
楼主你感受一下。
---------------------------------------------------------------------------------
术语来讲的区别:
1.==是判断两个变量或实例是不是指向同一个内存空间
equals是判断两个变量或实例所指向的内存空间的值是不是相同
2.==是指对内存地址进行比较
equals()是对字符串的内容进行比较
3.==指引用是否相同
equals()指的是值是否相同
---------------------------------------------------------------------------------
尼玛,劳资要爆粗口了!劳资回答的这么认真,竟然有人点木有帮助啊摔!
---------------------------------------------------------------------------------
好吧,反对的哥们粗线了。看来我还得更仔细点了。但是我觉得题主要问的我上面的那些已经够回答了。。不过,再仔细点吧。
比较对象不同,也是不一样的。
1. 如果比较对象是值变量:只用==,equals()是不存在的。
为毛?通俗点讲呢,equals()是个函数啊亲,因为基本类型int float不是对象,根本就没有函数啊摔。再通俗点,int. equals(),这个写法你感受一下。。
2. 如果比较对象是引用型变量:就是我上面说的那个情况了。我觉得题主就是问这个的。
==:比较两个引用是不是指向同一个对象实例。
啥,你问我上面那句话啥意思,这说来话长了诶,来坐坐坐,咱从堆栈开始讲起~(自行百度吧亲,实在写不动了,改天补充吧。)
equals:
那啥,所有的对象都是继承自Object这个大家都知道吧。然后equals()就是这里面的一个函数,然后那啥,
Object里的equals的实现就是直接调用了==操作。
所以如果这个时候你自定义了一个类,仅仅继承自Object且没有重写equals方法,那么其equals操作也是与Object类一样,仅仅是直接调用==操作。
这个时候他俩没啥区别。当然这是废话,尼玛equals里面这时候本来就用的==,能不一样么摔。
这么说吧,这时候比较自定义类用equals和==是一样一样的,因为这个时候尼玛都是比较句柄地址, 自定义的类是继承于object,而object中的equals就是用==来实现的。参见上面那条。
如果一个类重写过equals方法(或者继承自一个重写过equals方法的类,那么效果与==操作就不一样了。其实我觉得这才是楼主真正要问的地方。这里参见最开始的回答。
另外,那啥,再加一句,instanceof 也是个好东西哇。你可以用他检查引用型变量是否属于某一个Class:那啥,返回的也是true 或者false,跟c#里的is差不多的说。
--------------------------------------------------------------
累死了。。答个题容易么,你们不给赞还点反对合适么摔。
另外,你们确定题主是要听补充的这些么摔!
另外,要是觉得还有地方存在问题的欢迎交流哦思密达~
如何记住嘛。如果单纯是想记住,
==:等于。
equals:相同。
两个长得一样的人,只能说长的相同(equals),但是不等于他们俩是一个人。你只要记住equals,==就不用记了。
楼主你感受一下。
---------------------------------------------------------------------------------
术语来讲的区别:
1.==是判断两个变量或实例是不是指向同一个内存空间
equals是判断两个变量或实例所指向的内存空间的值是不是相同
2.==是指对内存地址进行比较
equals()是对字符串的内容进行比较
3.==指引用是否相同
equals()指的是值是否相同
---------------------------------------------------------------------------------
尼玛,劳资要爆粗口了!劳资回答的这么认真,竟然有人点木有帮助啊摔!
---------------------------------------------------------------------------------
好吧,反对的哥们粗线了。看来我还得更仔细点了。但是我觉得题主要问的我上面的那些已经够回答了。。不过,再仔细点吧。
比较对象不同,也是不一样的。
1. 如果比较对象是值变量:只用==,equals()是不存在的。
为毛?通俗点讲呢,equals()是个函数啊亲,因为基本类型int float不是对象,根本就没有函数啊摔。再通俗点,int. equals(),这个写法你感受一下。。
2. 如果比较对象是引用型变量:就是我上面说的那个情况了。我觉得题主就是问这个的。
==:比较两个引用是不是指向同一个对象实例。
啥,你问我上面那句话啥意思,这说来话长了诶,来坐坐坐,咱从堆栈开始讲起~(自行百度吧亲,实在写不动了,改天补充吧。)
equals:
那啥,所有的对象都是继承自Object这个大家都知道吧。然后equals()就是这里面的一个函数,然后那啥,
Object里的equals的实现就是直接调用了==操作。
所以如果这个时候你自定义了一个类,仅仅继承自Object且没有重写equals方法,那么其equals操作也是与Object类一样,仅仅是直接调用==操作。
这个时候他俩没啥区别。当然这是废话,尼玛equals里面这时候本来就用的==,能不一样么摔。
这么说吧,这时候比较自定义类用equals和==是一样一样的,因为这个时候尼玛都是比较句柄地址, 自定义的类是继承于object,而object中的equals就是用==来实现的。参见上面那条。
如果一个类重写过equals方法(或者继承自一个重写过equals方法的类,那么效果与==操作就不一样了。其实我觉得这才是楼主真正要问的地方。这里参见最开始的回答。
另外,那啥,再加一句,instanceof 也是个好东西哇。你可以用他检查引用型变量是否属于某一个Class:那啥,返回的也是true 或者false,跟c#里的is差不多的说。
--------------------------------------------------------------
累死了。。答个题容易么,你们不给赞还点反对合适么摔。
另外,你们确定题主是要听补充的这些么摔!
另外,要是觉得还有地方存在问题的欢迎交流哦思密达~