1. 程式人生 > >hashSet的實現原理去重

hashSet的實現原理去重

nbsp pan ati 速度 底層 str sta 直接 list

/*
集合 的體系:
------------| Collection 單例集合的根接口
----------------| List  如果是實現了List接口的集合類,具備的特點: 有序,可重復。 
-------------------| ArrayList  ArrayList 底層是維護了一個Object數組實現的。 特點: 查詢速度快,增刪慢。
-------------------| LinkedList LinkedList 底層是使用了鏈表數據結構實現的, 特點: 查詢速度慢,增刪快。
-------------------| Vector(了解即可)  底層也是維護了一個Object的數組實現的,實現與ArrayList是一樣的,但是Vector是線程安全的,操作效率低。

----------------| Set  如果是實現了Set接口的集合類,具備的特點: 無序,不可重復。
-------------------| HashSet  底層是使用了哈希表來支持的,特點: 存取速度快. 

hashSet的實現原理:
    往Haset添加元素的時候,HashSet會先調用元素的hashCode方法得到元素的哈希值 ,
    然後通過元素 的哈希值經過移位等運算,就可以算出該元素在哈希表中 的存儲位置。
    
    情況1: 如果算出元素存儲的位置目前沒有任何元素存儲,那麽該元素可以直接存儲到該位置上。

    情況2: 如果算出該元素的存儲位置目前已經存在有其他的元素了,那麽會調用該元素的equals方法與該位置的元素再比較一次
    ,如果equals返回的是true,那麽該元素與這個位置上的元素就視為重復元素,不允許添加,如果equals方法返回的是false,那麽該元素運行 添加。
    
    
-------------------| TreeSet  
*/ class Person{ int id; String name; public Person(int id, String name) { super(); this.id = id; this.name = name; } @Override public String toString() { return "{ 編號:"+ this.id+" 姓名:"+ this.name+"}"; } @Override public int hashCode() { System.out.println(
"=======hashCode====="); return this.id; } @Override public boolean equals(Object obj) { System.out.println("======equals======"); Person p = (Person)obj; return this.id==p.id; } } public class Demo2 { public static void main(String[] args) { /*
HashSet set = new HashSet(); set.add("狗娃"); set.add("狗剩"); set.add("鐵蛋"); System.out.println("集合的元素:"+ set); */ HashSet set = new HashSet(); set.add(new Person(110,"狗娃")); set.add(new Person(220,"狗剩")); set.add(new Person(330,"鐵蛋")); //在現實生活中只要編號一致就為同一個人. System.out.println("添加成功嗎?"+set.add(new Person(110,"狗娃"))); System.out.println("集合的元素:"+set); } }

hashSet的實現原理去重