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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 学习代码 中级黑马   /  2014-3-23 11:35  /  895 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. import java.util.*;

  2. class Person
  3. {
  4.         private String name;
  5.         private int age;
  6.         Person(String name,int age)
  7.         {
  8.                 this.name = name;
  9.                 this.age = age;
  10.         }
  11.         public boolean equals(Object obj)
  12.         {
  13.                         if(!(obj instanceof Person))
  14.                                 return false;
  15.                         Person p = (Person)obj;
  16.                                 return this.name.equals(p.name)  && this.age== age;
  17.        
  18.         }
  19. public String getName()
  20.         {
  21.                         return name;
  22.         }
  23. public int getAge()
  24.         {
  25.                 return age;
  26.         }
  27. }
  28. class Demo
  29. {
  30.         public static void main(String[] args)
  31.         {
  32.                 ArrayList ar = new ArrayList();
  33.                 ar.add(new Person("zhangsan01",21));
  34.                 ar.add(new Person("zhangsan02",22));
  35.                 ar.add(new Person("zhangsan03",23));
  36.                 ar.add(new Person("zhangsan03",23));
  37.                 ar.add(new Person("zhangsan04",24));
  38.                 ar.add(new Person("zhangsan04",24));
  39.                         ar = show(ar);
  40.                        
  41.                 Iterator it = ar.iterator();
  42.                 while(it.hasNext())
  43.                 {
  44.                         Object obj = it.next();
  45.                                 Person p = (Person)obj;
  46.                         System.out.println(p.getName()+";;;;"+p.getAge());
  47.                 }
  48.         }
  49. public static ArrayList show(ArrayList ar)
  50.         {
  51.                 ArrayList lis = new ArrayList();
  52.                
  53.                 Iterator  it = ar.iterator();
  54.         while(it.hasNext())
  55.                 {
  56.                         Object obj =it.next();
  57.                         if (!lis.contains(obj))
  58.                         lis.add(obj);
  59.                                
  60.                 }
  61.                 return lis;
  62.         }

  63. }
复制代码

我想问一下,就是说如果在,哈希值相同,元素不相同的话,是可以存入的,是吧?为什么重写了Object 类中的方法,返回一个,自己定义的int 型的值,就能保证这些 对象 哈希值 是相同的啊?大神 帮忙解释一下

评分

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

查看全部评分

4 个回复

倒序浏览
这段代码不是HashSet集合,哈希值是根据内存地址计算出来了,如果不  Person类没有复写hashCode方法,那每次new的Person对象的哈希值都是不同的。

评分

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

查看全部评分

回复 使用道具 举报
你这代码不是 Arraylist去除相同元素吗......怎么跟问的不一样

评分

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

查看全部评分

回复 使用道具 举报
这段代码是去除ArrayList中重复对象的啊= =ArrayList底层结构是数组,对于数组中两个对象的hashCode()是一致的就判定这俩是一个了。
你如果复写hashCode()方法,让他们都返回一个哈希值,那当然认为它们是一个玩意儿……

评分

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

查看全部评分

回复 使用道具 举报
每个对象都是继承 Object类的   所以每个类都有 hashCode这个方法的

hashCode方法 会针对不同的对象返回不同的整数  一般是通过将对象的内部地址转换成

一个整数来实现的   你每new一个对象时,每个对象都会调用hashCode来进行比较,因为内存地址不同

所以hashCode获得的值就不同   现在咱们人为的把它改成一个固定的值,当new一个对象时,就不去找内存地址

去啦    最后,咱们通过hashCode方法获得的值,都是一样的  是咱们自定义的那个值

评分

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

查看全部评分

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