A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 陈迎春 中级黑马   /  2013-4-10 21:48  /  2255 人查看  /  17 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 陈迎春 于 2013-4-11 13:00 编辑

问题是:为什么System.out.println(v1.equals(v2));返回的false?
代码如下:
  1. class V
  2. {
  3.         
  4. }

  5. public class OverWriteEquals {

  6.         public static void main(String[] args) {
  7.                 String str1 = "123";
  8.                 String str2 = "123";
  9.                 System.out.println(str1.equals(str2));
  10.                 V v1 = new V();
  11.                 V v2 = new V();
  12.                 System.out.println(v1.equals(v2));
  13.         }

  14. }
复制代码

17 个回复

倒序浏览
System.out.println(v1.equals(v2));因为此处的equals是调用Object中的equals方法,比较的是地址值。
System.out.println(str1.equals(str2));而此处的equals是String类中自已的equals方法,是用于比较两个对象的内容的。复写了Object中的equals方法。查一下API文档就知道了。
回复 使用道具 举报
楼上的师兄讲的很到位
回复 使用道具 举报
equals 比较的是地址的值。
按照你的代码来看
想要让v1 v2 返回true
比如让str1 和str2 都指向同一个对象。
但是你的程序中,
str1 和 str2 分别指向两个对象,其中存储的也是那两个对象的地址值

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
V v1=new V();
V v2=new V();
v1,v2这是两个对象,比较的是Object中的equals()方法,Object中的equals()方法,比较的是地址值;两个不同的对象,地址值是不同的,所以输出false.
回复 使用道具 举报
str1和str2是true是因为"123"存在于字符串池中,两者指向了一个地址.
v1和v2创建了对象而并没有覆写Object中的equals方法所以用的是object中equals的默认方法即==操作符,也是比较两个变量指向的对象是否是同一个对象.结果就是false
可以查阅一下API文档里的object中equals方法和源码就知道了
回复 使用道具 举报
Asan 中级黑马 2013-4-10 22:11:38
7#
教你一个比较笨 的方法!只要new了,就是实例化了,分配了内存单元!equals比较的就是地址!一般书上还有例子里是比较  “=”和equals的区别吧!我记得
回复 使用道具 举报
v1是对象调用equals方法,继承自Object,比较的是地址值。
str1是String调用equals方法,String覆写了equals方法,改成比较字符串内容
回复 使用道具 举报
你这个new了两次,开辟了两个空间,地址是不同的,Object 类的 equals 方法实现对象上差别可能性最大的相等关系;即,对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true(x == y 具有值 true)。 你这两个是两个不同地址,不同对象,所以错误

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
看来你不清楚new对象的时候,内部都做了哪些事。new对象,就是在堆内存开辟一块空间存放对象,然后将这个内存的地址指向一个变量,这个变量时存放在栈内存中的。每当你new一个对象就会在堆内存存放一个对象,这些对象的地址时不同的。而equals方法是比较两个对象的内存地址,所有返回的是false.
回复 使用道具 举报
看看object中的源代码吧。。。
public boolean equals(Object obj) {
        return (this == obj);
    }

源代码里这样写道。。。。。
也就是如果你不去实现equals ,一个类继承了object中的equals
也就是比较的两个对象的地址
你new了两个对象,当然是两个不同的地址了,所以是false
回复 使用道具 举报
  1. class V
  2. {
  3.         String color;//在类中定义属性是为了该类的两个具体的对象方便进行比较。

  4.         V(String color) //自定义一个构造函数,方便于自己定义颜色参数。
  5.         {
  6.                 this.color = color;
  7.         }

  8.         //这里必须从写equals方法,系统默认返回的是false
  9.     public boolean equals(Object obj)
  10.         {
  11.                 if(obj == null)
  12.                         return false;
  13.                 else
  14.                 {
  15.                         if(obj instanceof V )
  16.                         {
  17.                                 V v = (V)obj;
  18.                                 if(v.color == this.color)
  19.                                         return true;
  20.                         }
  21.                 }
  22.                 return false;
  23.         }
  24.        
  25. }


  26. public class OverWriteEquals {

  27.        public static void main(String[] args) {

  28.                String str1 = "123";

  29.                String str2 = "123";

  30.                                 //String类已经重写了其equals方法,故可以直接比较。
  31.                System.out.println(str1.equals(str2));

  32.                 V v1 = new V("red");

  33.                 V v2 = new V("red");

  34.                                 //这样输出的就是true啦!
  35.                System.out.println(v1.equals(v2));

  36.         }
  37.   
  38. }

  39. 已改,这里必须重写equals方法!!还有你原程序中比较的是两个不同对象的地址,这是永远不会相等的。
复制代码

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 陈迎春 于 2013-4-10 23:42 编辑
通行天下 发表于 2013-4-10 23:15


灰常谢谢你们、、、我把你们的回复都认真的看了一遍,收获不少,谢谢
回复 使用道具 举报
王大斌 发表于 2013-4-10 23:05
看看object中的源代码吧。。。
public boolean equals(Object obj) {
        return (this == obj);


我把你们的回复都认真的看了一遍,收获不少,谢谢
回复 使用道具 举报
HM何伟 发表于 2013-4-10 21:54
System.out.println(v1.equals(v2));因为此处的equals是调用Object中的equals方法,比较的是地址值。
Syste ...

谢谢、、
回复 使用道具 举报



equals方法
用于比较两个独立对象的内容是否相同,就好比去比较两个人的长相是否相同,它比较的两个对象是独立的

(1)
基本类型没有equals方法,equals只比较值(对象中的内容)是否相同(相同返回true)。
      
(2)
一个类如果没有定义equals方法,它将默认继承Object中的equals方法,返回值与==方法相同,,
值得注意的是 : String虽然是继承了Object ,但是String 重写了Object  里面的equals方法,string的 equals方法 不是比较对象的内存地址值而是比较对象里面的内容 ,所以  String 类的equals方法 是比较内容的
(3)
在你的代码中str1和str2对象的内存地址值是不同的,因为他们是2个对象,,这个2个对象在内存里有不同的存放位置,,,所以==比较时str1和str2是不等的,,
所以str1==str2   返回false ,,,但是str1和str2 2个对象里面的内容是一样的,,使用equals方法 是比较他们的内容是否相同,,,同理你的v1和v2使用 equals方法 也是与str1.equals(str2)一样,,,




回复 使用道具 举报
如果问题未解决,请继续追问,如果没有问题了,请将帖子分类 改为“已解决”,谢谢
回复 使用道具 举报
黄玉昆 发表于 2013-4-11 08:57
如果问题未解决,请继续追问,如果没有问题了,请将帖子分类 改为“已解决”,谢谢 ...

好的,下次注意!不好意思
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马