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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© liuelxiwd 中级黑马   /  2013-4-28 09:26  /  1789 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 liuelxiwd 于 2013-5-1 10:20 编辑
  1. public class Student{

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

  3.                 Student stud1 = new Student("zhangsan");

  4.                 Student stud2 = new Student("zhangsan");

  5.                 //用==来比较

  6.                 if(stud1 == stud2){
  7.                
  8.                 System.out.println("1");

  9.                 }else{
  10.                
  11.                 System.out.println("0");
  12.                 }

  13.                
  14.                 //用equals来比较

  15.                 if(stud1.equals(stud2)){
  16.                
  17.                 System.out.println("2");
  18.                
  19.                 }else{

  20.                 System.out.println("3");

  21.                 }
  22.         }

  23. }
复制代码
上面这段代码中,用==比较,输出结果为false。因为stud1和stud2是指向的两个对象的引用,它们虽然值相同,但是属于两个对象,所以比较结果肯定为不同。若改为if(stud1.name == sutd2.name)结果就为相同了。

疑问:equals因该是比较两个对象的内容,为什么输出的还是3,即false???

评分

参与人数 1技术分 +1 收起 理由
HM汪磊 + 1

查看全部评分

7 个回复

倒序浏览
这里是因为你没有复写equals方法。
而是继承是Object。
Object是所有类的父类。
而Object中的equals方法和==是一个效果。都是比较引用地址值。

点评

果然是这个原因,非常感谢!!!  发表于 2013-4-28 09:42
回复 使用道具 举报
殇_心。 发表于 2013-4-28 09:35
这里是因为你没有复写equals方法。
而是继承是Object。
Object是所有类的父类。

一起学习咯
回复 使用道具 举报
楼主 你equals的时候是不是提示obj obj  这样是直接使用的obj的queals 要比较new出来的要自定义equals方法 demo如下
public class Person{
   private String name;
   public Person(String name)
  {
     this.name=name;
   }
public boolean equals(Object o)
{
  if (this==0) return true;
if (!o instanceof Person) return false;
final Person other=(Person)o;
if (this.name().equals(other.name()))
    return true;
else
  return false;
}

}


注意,在重写equals方法时,要注意满足离散数学上的特性

1、自反性   :对任意引用值X,x.equals(x)的返回值一定为true.
2    对称性:   对于任何引用值x,y,当且仅当y.equals(x)返回值为true时,x.equals(y)的返回值一定为true;
3    传递性:如果x.equals(y)=true, y.equals(z)=true,则x.equals(z)=true
4   一致性:如果参与比较的对象没任何改变,则对象比较的结果也不应该有任何改变
5   非空性:任何非空的引用值X,x.equals(null)的返回值一定为false

评分

参与人数 1技术分 +1 收起 理由
HM汪磊 + 1

查看全部评分

回复 使用道具 举报
陈山洪 来自手机 高级黑马 2013-4-28 09:55:54
报纸
尹丽峰 发表于 2013-4-28 09:49 楼主 你equals的时候是不是提示obj obj 这样是直接使用的obj的queals 要比较new出来的要自定义equals方法 ...

还要用到离散数学啊,表示狠无奈@_@
回复 使用道具 举报
尹丽峰 发表于 2013-4-28 09:49
楼主 你equals的时候是不是提示obj obj  这样是直接使用的obj的queals 要比较new出来的要自定义equals方法  ...

要写这么多啊,很感谢
回复 使用道具 举报
xiewen 中级黑马 2013-4-29 10:49:14
7#
使用==来判断两个变量是否相等时,如果两个变量是基本类型变量,且都是数值类型(不一定要求数据类型严格相同),则只要两个变量的值相等,就返回true。
但对于两个引用类型变量,它们必须指向同一个对象时,==判断才返回true,==不可用于比较类型上没有父子关系的两个对象。
你这里的equals方法比较Student类的两个实例返回false,是因为你没有重写Student类的equals和hashcode方法。
回复 使用道具 举报
个人见解,LZ的代码中stud1和stud2虽然都被赋值为“zhangsan”,但是他们在内存空间的“地址”是不一样的,比方说,stud1指向的是“000N12”的zhangsan,而stud2指向的是“000X23”的张三,所以他们并不相等(equals)
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马