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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 郑小杰 中级黑马   /  2012-8-2 21:07  /  1573 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

/*
向hashSet集合中存入自定对象
姓名和年龄相同为同一个人,重复元素
*/
import java.util.*;
class HashSetTest
{
public static void main(String[] args)
{
  HashSet hs = new HashSet();
  hs.add(new Person("a1",11));
  hs.add(new Person("a2",12));
  hs.add(new Person("a2",12));
  hs.add(new Person("a3",13));
  hs.add(new Person("a4",14));
  Iterator it = hs.iterator();
  while(it.hasNext())
  {
   Person p = (Person)it.next();
   sop(p.getName()+"::"+p.getAge());
  
  }
}

public static void sop(Object obj)
{
  System.out.println(obj);
}

}

class Person
{
private String name;
private int age;
Person(String name,int age)
{
  this.name = name;
  this.age = age;
}

public int hashCode()
{
  return name.hashCode()+age;//这个地方有没有更好的办法?
}
public boolean equals(Object obj)
{
  if(!(obj instanceof Person))
   return false;
  Person p = (Person)obj;
  System.out.println(this.name+"....."+p.name);
  
  return this.name.equals(p.name) && this.age==p.age;
  
}
  

public String getName() {
  return name;
}
public void setName(String name) {
  this.name = name;
}
public int getAge() {
  return age;
}
public void setAge(int age) {
  this.age = age;
}

}
保证元素唯一是先看HashCode值,再调用equals函数,而且这两个函数是集合底层内部调用的,那到底是怎么调用的?

4 个回复

倒序浏览
答曰:这两个函数既然是集合底层调用,就不必详究其调用过程了,拿来直接用即可!反正集合内部就是这样写的
回复 使用道具 举报
本帖最后由 徐帅 于 2012-8-2 21:25 编辑

当你使用哈希集合的时候,java虚拟机会自动调用。不知道你的意思是java虚拟机的工作原理,还是哈希集合的工作原理,个人根据张老师的视频对哈希集合的工作原理做了如下总结
1 哈希算法的原理:
将集合分成若干个存储区域,每个对象可以计算出一个哈希码,可以将哈希码分组,每组对应某个存储区域,根据一个对象的哈希码就可以确定该对象存储在哪个区域。
2 HashSet 集合的工作原理
就是采用哈希算法存取对象的集合,它内部采用对某个数字n进行取余的方式对哈希码进行分组和划分对象的存储区域,HashSet集合在比较的时候先算出对象的哈希值,找到相应的存储区,当然哈希码不同就不用比较了,若相同,然后再取出该区域的每个元素和对象用equals方法进行比较,这样不用遍历集合中的元素就可以得到结论。可见HashSet集合具有很好的对象检索性能。
3  什么时候覆盖HashCode方法?
为了让两个相等的对象也放在相同的区域,那么如果两个对象equals 相等,那么应该让他们的HashCode也相等,达到逻辑上一致,这样就可以在同一个区域进行比较, 防止相等的元素重复存入,当然前提是放在哈希集合中。
希望对楼主对于哈希集合的理解有所帮助

评分

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

查看全部评分

回复 使用道具 举报
HashSet底层数据结构是哈希表,是根据关键码值(Key value)而直接进行访问的数据结构。向表中存储数据时,首先会自动调用hashcode()函数来比较其存储的对象是否相同,这就是其根据关键码值进行直接访问的数据结构。我感觉是HashSet集合内部封装好的,要向该集合存入数据就必须先调用该函数来比较其哈希值是否相同,如若相同就调用equals函数,这就像是封装好的流程一样,是必定要走的。不知理解的正确不?
回复 使用道具 举报
问题已解决
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马