黑马程序员技术交流社区

标题: equals与==不得不说的事~! [打印本页]

作者: 胡大强    时间: 2012-6-17 01:08
标题: equals与==不得不说的事~!
equals 方法:(是String类从它的超类Object中继承的)被用来检测两个对象是否相等,即两个对象的内容是否相等。
==:用于比较引用和比较基本数据类型时具有不同的功能:
比较基本数据类型,如果两个值相同,则结果为true
而在比较引用时,如果引用指向内存中的同一对象,结果为true


Eg:

s1 = new String("java"); //创建的是字符串对象
s1.equals("java"); //返回true  比较s1对象的内容是不是"java”.
s1 == "java" //返回false 比较s1对象在内存中存放的地址和"java”的地址是不是同一个地址
//如果
s1 = "java"; //注意这种赋值方式和上面的区别
s1 == "java" //返回true


作者: 宋浩    时间: 2012-6-17 09:11
呵呵,感谢楼主分享~!~{:soso_e181:}
作者: sbeeqnui1987    时间: 2012-6-17 10:22
对于Person类的2个实体化对象P1与P2来说,他们被new出来后,占用的是不同的存储单元的,所以他们的地址并不相同,因此p1.equals(p2)为false 。
如果需要返回的结果为true,你必须重写equals方法。
例如在Person类里面重写equals方法(假设Person里面成员变量i的值相等就可以认为两个对象相等):
public boolean equals(Person p) {
    if(this.i == p.i) {
        return true;
    } else {
        return false;
}
}  
}
1.对于基本数据类型,只有==,没有equals()(注意String类型不是基本数据类型),所以很明显值相等就为true。
          2.对于字符串,==指比较两者的内存地址,equals()则重写了Object类的equals(),比较的是内容,你可以查看API看看它怎么重写的。对于字符串是存放在方法区的字符串常量池里的,无论定义多少,只要字符串值相等都指同一块内存地址,所以==和equals()结果没区别。
          3.对于实例对象而言,==比较的依然是内存地址(所以你可以看出无论什么情况,==一直比较的都是内存地址),而equals()默认重写Object类的equals()方法(比较地址)。但是一般我们会自己重写equals(),让它比较值是否相等。
          4.建议:和四楼一样,建议你学完“内存地址”和“重写”的内容,再回过头来看这一知识点,就能深刻明晰了。




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