中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

好程序員分享HashSet實現去除重復元素

發布時間:2020-08-08 00:00:04 來源:ITPUB博客 閱讀:179 作者:好程序員IT 欄目:編程語言

   好程序員 分享 HashSet 實現去除重復元素 首先 HashSet 當中有自己封裝了 add 方法

public boolean add(E e) {    

   return map.put(e, PRESENT)==null;

    }

private transient HashMap   <E,Object> map; // Dummy value to associate with an Object in the backing Map 用來匹配 Map 中后面的對象的一個虛擬值 private static final Object PRESENT = new Object();

put 方法的實現如下 :

public V put(K key, V value) {       

    if (key == null)          

   return putForNullKey(value);       

   int hash = hash(key.hashCode());        

   int i = indexFor(hash, table.length);        

   for (Entry<K,V> e = table; e != null; e = e.next) {            

   Object k;           

    if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {                

     oldValue = e.value;                

   e.value = value;                

   e.recordAccess(this);                

   return oldValue;            

   }        

}        

modCount++;        

addEntry(hash, key, value, i);        

return null;    

} 這個方法均為封裝并直接能調用 add 方法使用

由此可見 for 循環 , 遍歷 table 的元素

1. 由于 hash 碼值的不同 , 證明是新元素 , 就直接保存其中

如果沒有元素和傳入值的 hash 相等則判定為元素在 table 不存在 , 也直接保存添加到 table

2. 如果 hash 碼值相同 , equles 判斷相等 , 證明元素存在 , 則舍棄

3. 如果 hash 碼值相同 , equles 判斷不相等 , 證明元素不存在 , 則添加

如果元素和傳入值 hash 相等 , 接下來會調用 equles 方法判斷 , 依然相等的會認為已經存在的元素

不添加并結束 , 否則繼續添加

由此 hashcode() equles() 是核心關鍵點

hash 值是什么

可以通過對象的成員變量計算出來

成員數值相加計算并獲取 hash

類中重寫方法示例 :

public int hashCode() {

        final int prime = 31;

        int result = 1;

        result = prime * result + age;

        result = prime * result + ((name == null) ? 0 : name.hashCode());

        return result;

    }

因為對象的 name,age 有所不同導致相加計算結果也會不同

但是有可能存在對象成員變量不同 ,hash 碼相同的情況

因為必須再重寫另外一個方法

public boolean equals(Object obj) {

        if (this == obj)

            return true;

        if (obj == null)

            return false;

        if (getClass() != obj.getClass())

            return false;

        Person other = (Person) obj;

        if (age != other.age)

            return false;

        if (name == null) {

            if (other.name != null)

                return false;

        } else if (!name.equals(other.name))

            return false;

        return true;

    }

equles 實現分別對 name,age 進行判斷是否相等

 

通過這兩個方法 , 在向 hashSet 調用 add 添加元素時 , 就能準確保證判斷元素是否存在

比較 hash 碼同時比較 equles 雙重保障去除重復元素


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

澜沧| 彭山县| 平江县| 晋城| 博罗县| 文化| 蒙自县| 阳朔县| 潍坊市| 镇康县| 德保县| 龙海市| 海伦市| 长白| 即墨市| 营口市| 和平区| 台前县| 庆元县| 亚东县| 通化市| 潮州市| 景东| 阿城市| 上杭县| 安乡县| 林周县| 高邑县| 满洲里市| 吴川市| 黄平县| 尚义县| 陈巴尔虎旗| 四子王旗| 霍山县| 渝中区| 东城区| 佛教| 府谷县| 东兰县| 威海市|