黑马程序员技术交流社区

标题: equals(Object obj)什么时候用 [打印本页]

作者: 李凤鸣    时间: 2012-12-24 22:26
标题: equals(Object obj)什么时候用
本帖最后由 李凤鸣 于 2013-1-8 14:18 编辑
  1. class Person
  2. {
  3.         private String name;
  4.         private int age;
  5.         Person(String name,int age)
  6.         {
  7.                 this.name=name;
  8.                 this.age=age;
  9.         }

  10.         public boolean equals(Object obj)
  11.         {
  12.                 System.out.println("7");
  13.                 if(!(obj instanceof Person))
  14.                         return false;

  15.                 Person p=(Person)obj;
  16.                 System.out.println(this.name+"..."+p.name);
  17.                 return this.name.equals(p.name)&&this.age==p.age;
  18.         }



  19.         public String getName()
  20.         {
  21.                 return name;
  22.         }

  23.         public int getAge()
  24.         {
  25.                 return age;
  26.         }
  27. }

  28. class ArrayListTest2
  29. {
  30.         public static void main(String[] args)
  31.         {
  32.                 ArrayList al=new ArrayList();
  33.                 al.add(new Person("lisi01",20));
  34.                 al.add(new Person("lisi02",28));
  35.                 al.add(new Person("lisi03",27));
  36.                 al.add(new Person("lisi04",26));
  37.                 al.add(new Person("lisi05",25));
  38.                 al.add(new Person("lisi06",23));
  39.                 al.add(new Person("lisi07",21));
  40.                 al.add(new Person("lisi03",27));
  41.                
  42.                 sop("1");
  43.                 al=singleElement(al);
  44.                 sop("2");
  45.                 Iterator it=al.iterator();
  46.                 sop("3");
  47.                 while(it.hasNext())
  48.                 {
  49.                         sop("4");
  50.                         Person p=(Person)it.next();
  51.                         sop("5");
  52.                         sop(p.getName()+"::"+p.getAge());
  53.                         sop("6");
  54.                 }

  55.         }

  56.         public static ArrayList singleElement(ArrayList al)
  57.         {
  58.                 //定义一个临时容器
  59.                 ArrayList newaArrayList=new ArrayList();
  60.                 Iterator iterator=al.iterator();
  61.                 while (iterator.hasNext()) {
  62.                         Object obj=iterator.next();
  63.                         if (!newaArrayList.contains(obj)) {
  64.                                 newaArrayList.add(obj);
  65.                         }
  66.                         
  67.                 }
  68.                 return newaArrayList;
  69.         }
  70.         public static void sop(Object obj)
  71.         {
  72.                 System.out.println(obj);
  73.         }
  74. }
复制代码
这是视频中的一个例子,重写了equals方法,视频里讲是因为contanse(Object obj) 中有 equals方法
是说这里面的equals只能比较地址么,而不是equals(Object obj)

equals(Object obj)这个方法在什么时候用

作者: 翁鹏    时间: 2012-12-24 23:15
本帖最后由 翁鹏 于 2012-12-24 23:18 编辑

你自己都不是说了Object中的equals是比较两个对象的地址吗。
如果你的需求不是要比较两个对象的地址是否一样来判断两个是否相等,就要自定义equals方法,覆盖掉Object中的equals方法。
一般我们的需求是要比较对象中的各个属性是否相等,来判断两个对象是否相等。
你上面的代码中的Person类就是依据name 和 age属性来比较两个对象是否相等的。

作者: 郭俊    时间: 2012-12-24 23:31
  1,  此案例中的equals方法是重写了Object类的equals(),判断同名同年龄的人是同一个人。
2,   没有重写Object中的equals(),那默认比较的是地址值,这个时候它和 == 相等。对我们来说一般没有意义。所以,一般我们会根据需求重写equals()。
      所以什么时候用得看需求
作者: 黄锦成    时间: 2012-12-25 11:37
因为默认在ArrayList中可以存放相同的元素,因为有索引。如果要元素唯一,我们可以复写equals方法,指定哪些条件相同即为相同元素
作者: 梁俊    时间: 2012-12-29 15:49
equals一般都是被重写的
作者: 罗利华    时间: 2012-12-29 17:53
"=="和equals方法究竟有什么区别?
==操作符专门用来比较变量的值是否相等。比较好理解的一点是:
对象变量其实是一个引用,它们的值是指向对象所在的内存地址,而不是对象本身 。
a和b都使用了new操作符,意味着将在内存中产生两个内容为"foo"的字符串,
既然是"两个",它们自然位于不同的内存地址。a和b的值其实是两个不同的内存地址的值,
所以使用"=="操作符,结果会是false.诚然,a和b所指的对象,它们的内容都是"foo",
应该是"相等",但是==操作符并不涉及到对象内容的比较。对象内容的比较,正是equals方
法做的事。看一下Object对象的equals方法是如何实现的:
  boolean equals(Object o){
  return this==o;}
  Object对象默认使用了==操作符。所以如果你自创的类没有覆盖equals方法,那你的类
使用equals和使用==会得到同样的结果。同样也可以看出,Object的equals方法没有达到
equals方法应该达到的目标:比较两个对象内容是否相等。因为答案应该由类的创建者决定,
所以Object把这个任务留给了类的创建者。所以当你是用equals方法判断对象的内容是否相等,
请不要想当然。因为可能你认为相等,而这个类的作者不这样认为,而类的equals方法的实现是
由他掌握的。如果你需要使用equals方法,或者使用任何基于散列码的集合(HashSet,HashMap,HashTable),
请查看一下java doc以确认这个类的equals逻辑是如何实现的。
作者: 黄锦成    时间: 2012-12-29 18:34
从Object中继承下载的equals是比较内存地址的。在使用List集合,Set集合时,Map时,可根据自己的需要重写此方法,当然,使用了哈希表的集合也要覆写hashcode方法




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