黑马程序员技术交流社区
标题:
哈希表
[打印本页]
作者:
王冬
时间:
2012-10-9 16:55
标题:
哈希表
本帖最后由 王冬 于 2012-10-10 21:37 编辑
哈希表是对数据结构来说的吗?它的作用是什么?哈希值相同时是一个什么情况?大家帮忙解释一下,不太清楚
作者:
徐帅
时间:
2012-10-9 19:59
哈希算法的原理:将集合分成若干个存储区域,每个对象可以计算出一个哈希码, 可以将哈希码分组,每组对应某个
存储区域,根据一个对象的哈希码就可以确定该对象存储在哪个区域。
HashSet 集合的工作原理
采用哈希算法存取对象的集合,它内部采用对某个数字n进行取余的方式对 哈希码进行分组和划分对象的存储区域,HashSet
集合在比较的时候先算出对象的哈希值,找到相应的存储区,当然哈希码不同就不用比较了,若相同,然后再取出该区域的每
个元素和对象用equals方法进行比较,这样不用遍历集合中的元素就可以得到结论。可见HashSet集合具有很好的对象检索性能。
hashCode与equals的应用:
我们一般存储对象的时候,都要复写HashCode和equals方法。因为对象有自己的属性,也就要按照对象的属性来比较两个对象是否相同,
而原有的hashCode和equals方法都是根据地址或根据地址算出来的值来进行比较,(hashCode内部调用的也是equals方法)没意义,所以
复写hashCode和equals方法,按照元素自身条件特点来判断元素的唯一性。
集合以下代码,看看打印结果,对象存入时是如何调用hashCode和equals方法的。
import java.util.HashSet;
import java.util.Iterator;
class HashSetTest {
public static void sop(Object obj) {
System.out.println(obj);
}
public static void main(String[] args) {
HashSet hs = new HashSet();
hs.add(new Person2("a1", 11));
hs.add(new Person2("a2", 12));
hs.add(new Person2("a3", 13));
// hs.add(new Person2("a2",12));
// hs.add(new Person2("a4",14));
// sop("a1:"+hs.contains(new Person("a2",12)));
// hs.remove(new Person("a4",13));
Iterator it = hs.iterator();
while (it.hasNext()) {
Person2 p = (Person2) it.next();
sop(p.getName() + "::" + p.getAge());
}
}
}
class Person2 {
private String name;
private int age;
Person2(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public int hashCode() {
System.out.println(this.name + "....hashCode");//判断何时调用hashCode方法
return name.hashCode() + age * 37;
}
public boolean equals(Object obj) {
if (!(obj instanceof Person))
return false;
Person2 p = (Person2) obj;
System.out.println(this.name + "...equals.." + p.name);//判断何时调用equals方法
return this.name.equals(p.name) && this.age == p.age;
}
}
复制代码
希望对楼主有所帮助
作者:
王冬
时间:
2012-10-9 23:00
徐帅 发表于 2012-10-9 19:59
哈希算法的原理:将集合分成若干个存储区域,每个对象可以计算出一个哈希码, 可以将哈希码分组,每组对 ...
谢谢:lol
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2