黑马程序员技术交流社区
标题:
最近看到一个问题equals和“==”的区别
[打印本页]
作者:
吴刚—heima
时间:
2013-5-28 13:34
标题:
最近看到一个问题equals和“==”的区别
请详细的阐述一下问题所述的内存机制原理,我以前一直以为euqals就是比较两个字符串,‘==’比较的是基本数据类型,但是好像最近在编程的时候好像发现不少i这么回事,请大家解答一下
作者:
顾玲玉
时间:
2013-5-28 13:58
equals 方法(是String类从它的超类Object中继承的)被用来检测两个对象是否相等,即两个对象的内容是否相等。
==用于比较引用和比较基本数据类型时具有不同的功能:
比较基本数据类型,如果两个值相同,则结果为true
而在比较引用时,如果引用指向内存中的同一对象,结果为true
Eg:s1 = new String("sony"); //创建的是字符串对象
s1.equals("sony"); //返回
trues1 == "sony" //返回false
//如果
s1 = "sony";
s1 == "sony" //返回true
作者:
Changer_s
时间:
2013-5-28 14:04
http://bbs.itheima.com/forum.php ... mp;highlight=equals
http://bbs.itheima.com/forum.php ... mp;highlight=equals
这两个网址可以去看看,都有解释
作者:
w270307032
时间:
2013-5-28 14:52
equals 方法是object中的方法,一些类比如String ArrayList等都会覆盖此方法的,方法一旦覆盖他们的实现原来肯定就一样,比较的东西自然就不一样了,所以equals比较的到底是什么东西,你只能去查看这个类中是否覆盖的这个方法,还有它的原代码是如何实现的,比如String类就覆盖了equals方法,比较的是2个字符串的内容是否相同。如果没覆盖,但是你又调用了,那用的就是object中的equals方法。
你也可以自己定义一个类,然后覆盖equals方法,里面写上你认为2个指向型引用或对象,该方法返回值为真的要求。比如你定义了1个person这个类,你可以把equals方法定义为name相同即返回真,或者age相同即返回为真,或者其它情况都行,随你自己便。但是如果2个person用“==”比较,返回的肯定是flase.
而==用于比较引用和比较基本数据类型时具有不同的功能:
比较基本数据类型,如果两个值相同,则结果为true
而在比较引用时,如果引用指向内存中的同一对象,结果为true
作者:
紫衣侯
时间:
2013-5-28 18:11
==比的是内存中的地址,其实equals()方法比的也是内存地址,因为equals方法源码内部也是用==实现的,这是object类的equals方法,而平时大家说的equals方法一般只string类的equals方法,它是重写的object类方法,所以可以比较是否相等
作者:
不胖的胖子
时间:
2013-5-28 18:34
== 和 equals 比较运算符
Java中有两种判断两个变量“相等”的方式。
1,==
使用 == 判断两个变量相等
参与比较的两个变量时基本类型变量(数值型):只要两个变量的值相等,使用 == 判断
就会返回true
参与比较的两个变量时引用类型(指向对象):当它们指向同一个对象时, == 判断返回
true。(
不在同一继承体系无法比较
)。
重点:== 比较对象的引用时,就是比较对象相等。实际判断的是判断该对象在内存中的
首地址。这是一种绝对相等。
2, equals
equals方法就是我们所说的
“逻辑相等”
。什么是逻辑相等?equals方法的方法体内写上
你指定的比较方式,想怎么相等就怎么相等。实际是不能这么干的(想进一步了解如何写
equals方法 可参考 effective java)
看下面代码:(简单粗暴)
public class MyEquals
{
public static void main(String args[]){
Foo firVar = new Foo();
Foo secVar = new Foo();
String str = new String("!");
System.out.println(firVar == secVar);
//System.out.println(firVar == str);不可比较的类型:Foo 和 java.lang.String
System.out.println(firVar.equals(secVar));
System.out.println(firVar.equals(str));
}
}
class Foo
{
public boolean equals(Object obj){
return true;//只要按照我的逻辑,任意对象和Foo对象逻辑上相等
}
}
复制代码
---------- 运行java程序 ----------
false
true
true
输出完成 (耗时 0 秒) - 正常终止
复制代码
从输出结果可以看到。 想用 == 比较没有继承关系的 Foo对象和String对象,直接报错。
用equals这个逻辑相等的方法。什么对象都可以“相等”。但是这样显然没有任何意义。
写在后面的
参考书目 effective java ————>怎样改写equals方法
疯狂java讲义—————> == 和 equals 的比较
在集合框架中的HashSet集合 会详细讲到 equals 方法 和 hashCode 方法的覆盖
作者:
袁梦希
时间:
2013-5-29 17:04
如果问题已经解决,请把帖子的类型改为已经解决,如果不会解决请看我的个性签名。
作者:
张林敏
时间:
2013-5-30 13:27
本帖最后由 张林敏 于 2013-5-30 13:31 编辑
看了,各种解释后,感觉自己越来越迷糊了
可能可以这样理解,== 比较的是这个变量存在值栈的值,equals 比较的是取出值栈的值,然后找出在堆中的值进行判断
作者:
beat_heart
时间:
2014-2-26 16:40
==就是判断等号两边值是否相等,euqals是判断两边字符串是否相同
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2