hashSet的實現原理去重


/*
集合 的體系:
------------| 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);
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM