黑马程序员技术交流社区
标题:
关于“==”号和“equals”
[打印本页]
作者:
布鲁Go
时间:
2013-12-28 22:49
标题:
关于“==”号和“equals”
本帖最后由 布鲁Go 于 2013-12-29 18:53 编辑
看视频的时候,“==”号和“equals” 经常把我搞得很晕,后来看到一篇文章是这样分析的:
基本数据类型,用==比的就是他们的值。
引用数据类型,用==比的就是他们的内存地址。
object 的equals方法底层也是==号,所以,如果类中的equals没有被复写过,就和==号相同,而复写了 按复写了的算。
复写过equals的类有:
java.io.file j ava.util.Date java.lang.string 包装类(Integer,Double等)————(恩,感觉总结的应该不全)
恩,看完瞬间觉得思路清晰,一切明了。。。就是不太敢确定是不是确实就这样,但至于什么时候用==,什么时候equals 还是不太确定。
我一直觉得java这里设计的很奇怪。
比如你把所有基本数据类型都用==比,然后引用数据类型都用“equals”来比不就好了,默认就是 比较两个对象内容是否相等。
毕竟比较地址值的应用感觉比较少,非要比的话,对象后面再 . 一个hashcode不就好了。。
目前这样要判断内容是否相等,一会儿复写这个,一会儿复写那个感觉有点复杂。
恩,当然java发展到现在肯定有考虑过类似问题,以上纯属新手吐槽,不知道有没有高手把这两个理解的更深入更透彻的。。
譬如能讲明白为什么要设计这样的两个东东,具体在什么时候用哪个比较好之类的。。。。求指点,拜谢。。。。
作者:
DOOR
时间:
2013-12-28 22:55
留个记号,我发帖问过类似的问题,同样期待有高手把这两个解释的更深入更透彻
作者:
LuckyQS
时间:
2013-12-29 12:55
1.equals方法可以被重写,而且推荐将euqals和hashcode两个方法一起重写,之后比较的是hashcode,
不重写equals方法的话,会调用父类的equals方法,追溯到Object的话 euqals 就是 ==
==这个不能被重写,比较的是是否指向同一个对象实例
2.equals方法的参数是Object,所以两者不需要是同一类型的对象
==如果两者不是相同类型,编译器会报错
例如:
class Demo
{
public static void main(String[] args)
{
Person p1=new Person("zhansan",20);
Person p2=new Person("zhansan",20);
System.out.println(p1.equals(p2)+"---"+(p1==p2));//false false
/*
equals是Object类中的方法,是判断对象是否相同,即判断地址是否一样 ,所以p1.equals(p2)结果是false;而==是比较运算符,p1和p2是各指向两个对象,因此结果为false
*/
String s1=new String("lisi");
String s2=new String("lisi");
System.out.println(s1.equals(s2)+"---"+(s1==s2));//true false
/*
字符串中的equals方法是重写了object中的equals方法,判断两个字符串是否相同。所以s1.equals(s2)结果是true;而s1和s2是各指向两个字符串变量,因此为false
*/
String s3="lisi";
System.out.println(s1.equals(s3)+"---"+(s1==s3));//true false
/*
这其中涉及到了字符串引用型变量实例化时,先查询内存中是否已经有“lisi”字符串对象,如果有了,则指向该对象。否则,新建字符串对象。所以s1.equals(s3)结果是true,而s1!=s3与第二种情况相同。
*/
}
}
class Person
{
private String name;
private int age;
Person(String name,int age)
{
this.name=name;
this.age=age;
}
}
作者:
浮出一个美
时间:
2013-12-29 19:55
源码面前,一目了然:
Object里的equals方法:
public boolean equals(Object obj) {
return (this == obj);
}
String里的equals方法:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = count;
if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
if (v1[i++] != v2[j++])
return false;
}
return true;
}
}
return false;
}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2