1. 程式人生 > >HashSet實現原理

HashSet實現原理

運行 equal false spa 比較 logs pan ole print

/*

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]

HashSet實現原理