黑马程序员技术交流社区

标题: 关于方法复写 [打印本页]

作者: 学习代码    时间: 2014-3-25 18:08
标题: 关于方法复写
  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)  //为什么这里只要复写这一个方法而已啊 为什么hashCode    为什么不要
  11.         {
  12.                         if(!(obj instanceof Person))
  13.                                 return false;
  14.                         Person p = (Person)obj;
  15.                                 return this.name.equals(p.name)  && this.age== age;
  16.        
  17.         }
  18. public String getName()
  19.         {
  20.                         return name;
  21.         }
  22. public int getAge()
  23.         {
  24.                 return age;
  25.         }
  26. }
  27. class Demo
  28. {
  29.         public static void main(String[] args)
  30.         {
  31.                 ArrayList ar = new ArrayList();
  32.                 ar.add(new Person("zhangsan01",21));
  33.                 ar.add(new Person("zhangsan02",22));
  34.                 ar.add(new Person("zhangsan03",23));
  35.                 ar.add(new Person("zhangsan03",23));
  36.                 ar.add(new Person("zhangsan04",24));
  37.                 ar.add(new Person("zhangsan04",24));
  38.                         ar = show(ar);
  39.                        
  40.                 Iterator it = ar.iterator();
  41.                 while(it.hasNext())
  42.                 {
  43.                         Object obj = it.next();
  44.                                 Person p = (Person)obj;
  45.                         System.out.println(p.getName()+";;;;"+p.getAge());
  46.                 }
  47.         }
  48. public static ArrayList show(ArrayList ar)
  49.         {
  50.                 ArrayList lis = new ArrayList();
  51.                
  52.                 Iterator  it = ar.iterator();
  53.         while(it.hasNext())
  54.                 {
  55.                         Object obj =it.next();
  56.                         if (!lis.contains(obj))
  57.                         lis.add(obj);
  58.                                
  59.                 }
  60.                 return lis;
  61.         }

  62. }
复制代码

作者: 苏伯亚    时间: 2014-3-25 18:18
没有导入util包
作者: xuehuayous    时间: 2014-3-25 18:24
你用的ArrayList创建的对象ar,ArrayList底层的数据结构使用的是数组结构;
HeshSet是通过元素的两个方法,hashcode和equals来完成的。如果元素的hashcode值相同,才会判断equals是否为true;如果元素的hashcode值不同,不会调用equals。
菜鸟回复,希望对你有帮助!

作者: 学习代码    时间: 2014-3-25 18:45
xuehuayous 发表于 2014-3-25 18:24
你用的ArrayList创建的对象ar,ArrayList底层的数据结构使用的是数组结构;
HeshSet是通过元素的两个方法, ...

谢谢 朋友   大家都是刚刚 学习的  相互帮助
作者: 牛头人图腾    时间: 2014-3-25 20:31
一、方法的复写是看需求而定的,不是一定要复写。即使是存元素进HashSet也不一定说要复写hashCode和equals方法。
二、在你的问题中,你想往ArrayList中存入Person对象,并且年龄相同、姓名相同视为相等(相同元素)。所以才要复写equals方法。如果你认为任何的一个new Person()都视为不相等是不用复写equals方法的。调用contains方法会调用对象的equals方法,ArrayList比较对象是否相同用的是对象的equals方法。
三、像HashSet集合,也不一定要复写hashCode、equals方法。只有当在你的问题领域中确定依据什么判断对象是否相同才需要选择是否复写方法、如何去复写方法。
作者: leon_hm    时间: 2014-3-25 20:47
因为ArrayList调用contains方法的时候需要比较两个Person对象是否相等。此时就会调用Person对象的equals方法。如果Person类中没有重写equals方法,则会调用Person的父类,即Object类中的的equals方法。
作者: caijunsong    时间: 2014-3-26 00:46
我把你的代码编译一遍  主要出现了一处就是你用到集合但是你忘了导包 import java.util.*;

复写equals()的时候是不是一定要复写hashcode()?
答案是   不一定
一般情况下不需要复写hashcode()方法,当用到某些集合(HashSet、LinkedHashSet、HashMap、LinkedHashMap)的时候,一定要复写hashcode()方法,因为这些集合用到了哈希算法,哈希算法一定要用到hashcode()。
总之:当集合的元素不在是单纯的String的时候 就一定要复写equals()方法,而在分配内存的是用刀了哈希算法的时候 就需要复写hashCode()函数





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