黑马程序员技术交流社区

标题: equals的问题 [打印本页]

作者: 邢义敏    时间: 2013-3-5 16:06
标题: equals的问题
本帖最后由 邢义敏 于 2013-3-5 21:49 编辑
  1. class V{
  2. }
  3. public class OverWriteEquals {
  4. public static void main(String[] args) {
  5. String s1="123";//实例化两个对象,内容相同
  6. String s2="123";
  7. System.out.println(s1.equals(s2));//使用equals()方法比较s1、s2对象
  8. V v1=new V();//实例化两个V类对象
  9. V v2=new V();
  10. System.out.println(v1.equals(v2));//使用equals()方法比较s1、s2对象
  11. }

  12. }
复制代码
运行结果:
true
false


我想问的是,equals()方法不是比较内容的吗,为什么v1.equals(v2)的值为false呢?
作者: 陈圳    时间: 2013-3-5 16:20
equals是超类Object的方法,String中复写过它,所以是比较内容的,
你自己定义的类是没有复写的,调用的就是Object中的,那是比较地址的.
作者: 杜超    时间: 2013-3-5 16:46
equals方法:如果比较的是字符串类型的,则比较的是内容;如果非字符串类型则比较的是地址。
String s1="123";//实例化两个对象,内容相同
String s2="123";
System.out.println(s1.equals(s2));//使用equals()方法比较s1、s2对
这个比较的是字符串“123”,所以相等。

V v1=new V();//实例化两个V类对象
V v2=new V();
System.out.println(v1.equals(v2));//使用equals()方法比较s1、s2对象
这个比较的非字符串类型,比较内容为空,比较的是地址,而这两个地址不一样,所以为false.



作者: 卢浩    时间: 2013-3-5 16:56
这里的equals(Object obj)实际上调用的是object类的equals方法,其比较规则为:当参数obj引用的对象与当前对象为同一个对象时,就返回true,否则返回false。而你的代码中v1和v2是通过两个new语句构造的两个不同的对象,所以结果为false

作者: 克零岚    时间: 2013-3-5 17:10
恩呢,比较的是地址呢,只要new出来的对象都会在内存中分配一个存储空间给它,两个不同的内存空间作比较,当然为false;
对于,如下:
String s1="123";
String s2="123";
System.out.println(s1.equals(s2));   //结果为false。
java运行环境有一个字符串池。比如String str="123"时,会首先查看字符串池中是否存在字符串"123",如果存在则直接将"123"赋给str,如果不存在则会先在字符串池中新建一个字符串"123",然后再将其赋给str,所以说s1和s2指向同一个对象;
再有:
String s1=new String("123");
String s2=new String("123");
System.out.println(s1==s2);      //false ,此时创建了三个对象(
字符串池中1个,堆中2个)
这时用==判断就可知,虽然两个对象的"内容"相同(equals()判断),但两个引用变量所持有的引用不同,new创建字符串时首先查看池中是否有相同值的字符串,如果有,则拷贝一份到堆中,然后返回堆中的地址;如果池中没有,则在堆中创建一份,然后返回堆中的地址






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