哈希算法的原理:将集合分成若干个存储区域,每个对象可以计算出一个哈希码, 可以将哈希码分组,每组对应某个
存储区域,根据一个对象的哈希码就可以确定该对象存储在哪个区域。
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;
- }
- }
复制代码 希望对楼主有所帮助 |