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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王冬 中级黑马   /  2012-10-9 16:55  /  1277 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 王冬 于 2012-10-10 21:37 编辑

哈希表是对数据结构来说的吗?它的作用是什么?哈希值相同时是一个什么情况?大家帮忙解释一下,不太清楚

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

2 个回复

倒序浏览
  哈希算法的原理:将集合分成若干个存储区域,每个对象可以计算出一个哈希码, 可以将哈希码分组,每组对应某个
存储区域,根据一个对象的哈希码就可以确定该对象存储在哪个区域。

HashSet 集合的工作原理
采用哈希算法存取对象的集合,它内部采用对某个数字n进行取余的方式对   哈希码进行分组和划分对象的存储区域,HashSet
集合在比较的时候先算出对象的哈希值,找到相应的存储区,当然哈希码不同就不用比较了,若相同,然后再取出该区域的每
个元素和对象用equals方法进行比较,这样不用遍历集合中的元素就可以得到结论。可见HashSet集合具有很好的对象检索性能。

hashCode与equals的应用:
我们一般存储对象的时候,都要复写HashCode和equals方法。因为对象有自己的属性,也就要按照对象的属性来比较两个对象是否相同,
而原有的hashCode和equals方法都是根据地址或根据地址算出来的值来进行比较,(hashCode内部调用的也是equals方法)没意义,所以
复写hashCode和equals方法,按照元素自身条件特点来判断元素的唯一性。

集合以下代码,看看打印结果,对象存入时是如何调用hashCode和equals方法的。
  1. import java.util.HashSet;
  2. import java.util.Iterator;

  3. class HashSetTest {
  4.         public static void sop(Object obj) {
  5.                 System.out.println(obj);
  6.         }

  7.         public static void main(String[] args) {
  8.                 HashSet hs = new HashSet();

  9.                 hs.add(new Person2("a1", 11));
  10.                 hs.add(new Person2("a2", 12));
  11.                 hs.add(new Person2("a3", 13));
  12.                 // hs.add(new Person2("a2",12));
  13.                 // hs.add(new Person2("a4",14));

  14.                 // sop("a1:"+hs.contains(new Person("a2",12)));

  15.                 // hs.remove(new Person("a4",13));

  16.                 Iterator it = hs.iterator();

  17.                 while (it.hasNext()) {
  18.                         Person2 p = (Person2) it.next();
  19.                         sop(p.getName() + "::" + p.getAge());
  20.        }
  21.     }
  22. }

  23. class Person2 {
  24.         private String name;
  25.         private int age;

  26.         Person2(String name, int age) {
  27.                 this.name = name;
  28.                 this.age = age;
  29.         }

  30.         public String getName() {
  31.                 return name;
  32.         }

  33.         public int getAge() {
  34.                 return age;
  35.         }

  36.         public int hashCode() {
  37.                
  38.                 System.out.println(this.name + "....hashCode");//判断何时调用hashCode方法
  39.                 return name.hashCode() + age * 37;
  40.         }

  41.         public boolean equals(Object obj) {

  42.                 if (!(obj instanceof Person))
  43.                         return false;

  44.                 Person2 p = (Person2) obj;
  45.                
  46.                 System.out.println(this.name + "...equals.." + p.name);//判断何时调用equals方法

  47.                 return this.name.equals(p.name) && this.age == p.age;
  48.         }

  49. }
复制代码
希望对楼主有所帮助

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

回复 使用道具 举报
徐帅 发表于 2012-10-9 19:59
哈希算法的原理:将集合分成若干个存储区域,每个对象可以计算出一个哈希码, 可以将哈希码分组,每组对 ...

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