黑马程序员技术交流社区

标题: HashSet存储 [打印本页]

作者: 郑小杰    时间: 2012-8-2 21:07
标题: HashSet存储
/*
向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函数,而且这两个函数是集合底层内部调用的,那到底是怎么调用的?


作者: 冯华亮    时间: 2012-8-2 21:18
答曰:这两个函数既然是集合底层调用,就不必详究其调用过程了,拿来直接用即可!反正集合内部就是这样写的
作者: 徐帅    时间: 2012-8-2 21:24
本帖最后由 徐帅 于 2012-8-2 21:25 编辑

当你使用哈希集合的时候,java虚拟机会自动调用。不知道你的意思是java虚拟机的工作原理,还是哈希集合的工作原理,个人根据张老师的视频对哈希集合的工作原理做了如下总结
1 哈希算法的原理:
将集合分成若干个存储区域,每个对象可以计算出一个哈希码,可以将哈希码分组,每组对应某个存储区域,根据一个对象的哈希码就可以确定该对象存储在哪个区域。
2 HashSet 集合的工作原理
就是采用哈希算法存取对象的集合,它内部采用对某个数字n进行取余的方式对哈希码进行分组和划分对象的存储区域,HashSet集合在比较的时候先算出对象的哈希值,找到相应的存储区,当然哈希码不同就不用比较了,若相同,然后再取出该区域的每个元素和对象用equals方法进行比较,这样不用遍历集合中的元素就可以得到结论。可见HashSet集合具有很好的对象检索性能。
3  什么时候覆盖HashCode方法?
为了让两个相等的对象也放在相同的区域,那么如果两个对象equals 相等,那么应该让他们的HashCode也相等,达到逻辑上一致,这样就可以在同一个区域进行比较, 防止相等的元素重复存入,当然前提是放在哈希集合中。
希望对楼主对于哈希集合的理解有所帮助
作者: 刘真    时间: 2012-8-2 21:26
HashSet底层数据结构是哈希表,是根据关键码值(Key value)而直接进行访问的数据结构。向表中存储数据时,首先会自动调用hashcode()函数来比较其存储的对象是否相同,这就是其根据关键码值进行直接访问的数据结构。我感觉是HashSet集合内部封装好的,要向该集合存入数据就必须先调用该函数来比较其哈希值是否相同,如若相同就调用equals函数,这就像是封装好的流程一样,是必定要走的。不知理解的正确不?
作者: 郑小杰    时间: 2012-8-3 10:41
问题已解决




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