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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 学习代码 中级黑马   /  2014-3-25 18:08  /  1418 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  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. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
枫儿 + 1 神马都是浮云

查看全部评分

6 个回复

倒序浏览
没有导入util包
回复 使用道具 举报
你用的ArrayList创建的对象ar,ArrayList底层的数据结构使用的是数组结构;
HeshSet是通过元素的两个方法,hashcode和equals来完成的。如果元素的hashcode值相同,才会判断equals是否为true;如果元素的hashcode值不同,不会调用equals。
菜鸟回复,希望对你有帮助!

评分

参与人数 1技术分 +1 收起 理由
枫儿 + 1 赞一个!

查看全部评分

回复 使用道具 举报
xuehuayous 发表于 2014-3-25 18:24
你用的ArrayList创建的对象ar,ArrayList底层的数据结构使用的是数组结构;
HeshSet是通过元素的两个方法, ...

谢谢 朋友   大家都是刚刚 学习的  相互帮助
回复 使用道具 举报
一、方法的复写是看需求而定的,不是一定要复写。即使是存元素进HashSet也不一定说要复写hashCode和equals方法。
二、在你的问题中,你想往ArrayList中存入Person对象,并且年龄相同、姓名相同视为相等(相同元素)。所以才要复写equals方法。如果你认为任何的一个new Person()都视为不相等是不用复写equals方法的。调用contains方法会调用对象的equals方法,ArrayList比较对象是否相同用的是对象的equals方法。
三、像HashSet集合,也不一定要复写hashCode、equals方法。只有当在你的问题领域中确定依据什么判断对象是否相同才需要选择是否复写方法、如何去复写方法。

评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1

查看全部评分

回复 使用道具 举报
因为ArrayList调用contains方法的时候需要比较两个Person对象是否相等。此时就会调用Person对象的equals方法。如果Person类中没有重写equals方法,则会调用Person的父类,即Object类中的的equals方法。

评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1

查看全部评分

回复 使用道具 举报
我把你的代码编译一遍  主要出现了一处就是你用到集合但是你忘了导包 import java.util.*;

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

评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马