HashSet实现原理

/*

HashSet的实现原理:
  往HashSet添加元素的时候,HashSet会先调用元素的hashCode方法得到元素的哈希值 ,
  然后通过元素 的哈希值经过移位等运算,就可以算出该元素在哈希表中 的存储位置。

情况1: 如果算出元素存储的位置目前没有任何元素存储,那么该元素可以直接存储到该位置上。

情况2: 如果算出该元素的存储位置目前已经存在有其他的元素了,那么会调用该元素的equals方法与该位置的元素再比较一次
      ,如果equals返回的是true,那么该元素与这个位置上的元素就视为重复元素,不允许添加,如果equals方法返回的是false,那么该元素运行添加。

*/

 1 import java.util.*;
 2 
 3 class Person{
 4     String name;
 5     int id;
 6     
 7     public Person(String name, int id) {
 8         this.name = name;
 9         this.id = id;
10     }
11 
12     @Override
13     public String toString() {
14         return "Person [name=" + name + ", id=" + id + "]";
15     }
16 
17     @Override
18     public int hashCode() { //此时hashCode方法被调用4次
19         System.out.println("hashCode==============");
20         return this.id;
21     }
22     
23     @Override
24     public boolean equals(Object obj) { ////此时equals方法被调用1次
25         System.out.println("equals------------");
26         Person p = (Person) obj;
27         return this.id == p.id;
28     }
29     
30 }
31 
32 public class Demo5 {
33     public static void main(String[] args) {
34         HashSet set = new HashSet();
35         set.add(new Person("大师兄", 1));
36         set.add(new Person("二师兄", 3));
37         set.add(new Person("沙师弟", 2));
38         
39         //id唯一性,若id相同,就应该为同一人,为此,重写hashCode方法和equals方法
40         System.out.println("添加成功吗?" + set.add(new Person("师傅", 1)));
41         
42         Iterator it = set.iterator();
43         while(it.hasNext()){
44             System.out.println(it.next());
45         }
46     }
47 }

结果:

hashCode==============
hashCode==============
hashCode==============
hashCode==============
equals------------
添加成功吗?false
Person [name=大师兄, id=1]
Person [name=沙师弟, id=2]
Person [name=二师兄, id=3]

注意,这个是无序、不可重复的

比如:

HashSet set = new HashSet();
        set.add(new Person("大师兄", 1));
        set.add(new Person("二师兄", 3));
        set.add(new Person("沙师弟", 2));

        set.add(new Person("大师兄", 43));
        set.add(new Person("二师兄", 333));
        set.add(new Person("沙师弟", 22));
        set.add(new Person("大师兄", 33));
        set.add(new Person("二师兄", 344));
        set.add(new Person("沙师弟", 211));

此时结果:

hashCode==============
hashCode==============
hashCode==============
hashCode==============
hashCode==============
hashCode==============
hashCode==============
hashCode==============
hashCode==============
hashCode==============
equals------------
添加成功吗?false
Person [name=大师兄, id=1]
Person [name=大师兄, id=33]
Person [name=沙师弟, id=2]
Person [name=二师兄, id=3]
Person [name=沙师弟, id=211]
Person [name=沙师弟, id=22]
Person [name=二师兄, id=344]
Person [name=大师兄, id=43]
Person [name=二师兄, id=333]

 

posted @ 2017-05-06 12:07  shadowdoor  阅读(8490)  评论(0编辑  收藏  举报