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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李志广 中级黑马   /  2012-7-28 22:54  /  2128 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

hashCode 方法对于hashSet 的作用是什么?

4 个回复

倒序浏览
HashSet是如何保证元素的唯一性呢?
      是通过元素的两个方法,hashCode和equals来完成;
      如果元素的hashCode值相同,才会判断equals是否为true;
      如果元素的hashCode值不同,不会调用eauals;
回复 使用道具 举报
HashSet集合里面的元素都是没有索引的,实际上当程序向HashSet集合中添加元素的时候,HashSet集合会根据这个元素的HashCode值来决定他的存储位置,首先HashSet会调用该对象的hashCode()方法来得到该对象的hashCode值,然后根据该hashCode值决定该对象在HashSet中的存储位置。如果两个元素通过equals方法比较返回true,但它们的hashCode()方法返回值不相等,HashSet将会把它们存储在不同位置,也就添加成功。 如果两个对象通过equals方法比较相等,并且两个对象的hashCode()方法返回值也相等 ,那么只会保留一个元素。
回复 使用道具 举报
HashSet是Set集合类的子类,Set集合都有个共同特点是元素是不重复的,无序的(添加和取出的顺序不一定一样),非同步的。
HashSet的底层数据结构就是Hash值组成的Hash表
而HashSet就是通过HashCode和equals方法来判断元素是否重复
当一个元素添加到HashSet集合中时,会自动调用HashCode方法算出元素对象的Hash值,也就是地址值,从而找到元素存放的位置,
自动把当前要添加的元素和集合里的元素比较,如果Hash值不同,就会存到相应的地址位置,如果Hash值相同,就会调用equals方法(继承的Object类的)
来比较元素对象是否相同,如果不是同一个对象,那么就会添加到Hash值相同的那个元素位置底下顺延,
如果是同一个对象,即HashCode和equals方法返回结果都为true时,也就是两个条件都成立,那么就会视为重复元素,
add方法添加元素时就会返回false,也就不会添加成功,这种方式就保证了元素的唯一性。
但是往往用到数据结构是hash表的集合,都要覆写HashCode和equals方法,自定义算出HashCode的条件和判断对象是否相同的条件,因为一般继承过来的方法
往往不是你想要的。
比如将同姓名同年龄的人视为重复元素,以这个为条件的话就必须要覆写HashCode和equals方法,代码如下:
  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.                         throw new ClassCastException("不是Person类");
  15.                 Person p = (Person)obj;
  16.                 return this.name.equals(p.name) && this.age == p.age;
  17.         }
  18.         public int hashCode()
  19.         {
  20.                 return name.hashCode()+age;
  21.         }
  22.         public void setName(String name)
  23.         {
  24.                 this.name = name;
  25.         }
  26.         public String getName()
  27.         {
  28.                 return name;
  29.         }
  30.         public void setAge(int age)
  31.         {
  32.                 this.age = age;
  33.         }
  34.         public int getAge()
  35.         {
  36.                 return age;
  37.         }
  38. }
  39. class HashSetTest
  40. {
  41.         public static void main(String[] args)
  42.         {
  43.                 HashSet<Person> hs = new HashSet<Person>();
  44.                 hs.add(new Person("zhangsan",23));
  45.                 hs.add(new Person("lisi",12));
  46.                 hs.add(new Person("wangwu",21));
  47.                 hs.add(new Person("zhangsan",23));
  48.                 hs.add(new Person("zhouming",14));
  49.                 Iterator<Person> it = hs.iterator();
  50.                 while (it.hasNext())
  51.                 {
  52.                         Person p = it.next();
  53.                         System.out.println(p.getName()+"..."+p.getAge());
  54.                 }
  55.         }
  56. }
复制代码
通过自定义条件覆写了Hashcode和equals方法
因为集合中已经存在了姓名是zhangsan,23岁的人,再存zhangsan,23就添加失败,这样就保证了元素的唯一性
楼主有空把HashSet集合用代码实践下,就会慢慢领悟到HashCode的作用了。

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

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