1. 程式人生 > >java 集合10 HashSet()儲存自定義物件

java 集合10 HashSet()儲存自定義物件

HashSet() Set 的實現類,內部是雜湊結構,保證元素的惟一性的方式依賴於:hashCode()【計算儲存位置】equals()【解決雜湊衝突】
無序的原因:計算出雜湊值後儲存的位置和新增進去的順序很有可能是不一致的。
當元素儲存到,HashCode() 中時,第一步都是先計算出元素對應的雜湊值。而在上述的例子中,儲存自定義的學生物件時,無法體現元素唯一行是因為,在堆中的每new 一個 物件,都有一個儲存位置,都有一個獨一無二的雜湊值

需求
在上述的情境下,仍然想要按照同姓名同年齡來保證學生物件的惟一性
解決辦法:不使用Object 中的hashCode() 方法,自己重寫hashCode () 方法
程式碼:

  //HashSetDemo_Set   重寫hashCode()  方法依賴於類的成員變數//依賴於姓名和年齡
    public int hashCode() {
        return name.hashCode()+age;
    }
 set.add(new Student("Lisi",20));
        set.add(new Student("Zhangshan",25));
        set.add(new Student("Lisi",20));
        set.add(new Student("Wangwu",18));

執行結果:[Lisi 20, Wangwu 18, Zhangshan 25]

思考過程
關於重寫 hashCode () 方法,如果只是單純的返回一個值,使所有的元素的雜湊值都一樣,那麼都會執行equals() 方法,效率變得很低。所以將雜湊值與類的成員變數相結合,儘量使不一樣的元素的雜湊值不一樣。在寫hashCode 函式時,一樣的元素計算出的雜湊值一定是一樣的,再呼叫equals() , 不一樣的元素的雜湊值有可能會偶然的一樣,但是也會呼叫equals() 最終會保證元素的一致性,同時保證效率。

Java可以自己為我們寫 equals 和hashCode 函式
操待查詢