真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

好程序員分享HashSet實(shí)現(xiàn)去除重復(fù)元素-創(chuàng)新互聯(lián)

   好程序員 分享 HashSet 實(shí)現(xiàn)去除重復(fù)元素 , 首先 HashSet 當(dāng)中有自己封裝了 add 方法

創(chuàng)新互聯(lián)于2013年成立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站建設(shè)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢想脫穎而出為使命,1280元沈北新做網(wǎng)站,已為上家服務(wù),為沈北新各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:13518219792

public boolean add(E e) {    

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

    }

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

而 put 方法的實(shí)現(xiàn)如下 :

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 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;    

} 這個(gè)方法均為封裝并直接能調(diào)用 add 方法使用

由此可見 for 循環(huán) , 遍歷 table 的元素

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

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

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

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

如果元素和傳入值 hash 相等 , 接下來會調(diào)用 equles 方法判斷 , 依然相等的會認(rèn)為已經(jīng)存在的元素

不添加并結(jié)束 , 否則繼續(xù)添加

由此 hashcode() 和 equles() 是核心關(guān)鍵點(diǎn)

hash 值是什么

可以通過對象的成員變量計(jì)算出來

成員數(shù)值相加計(jì)算并獲取 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;

    }

因?yàn)閷ο蟮? name,age 有所不同導(dǎo)致相加計(jì)算結(jié)果也會不同

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

因?yàn)楸仨氃僦貙懥硗庖粋€(gè)方法

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 實(shí)現(xiàn)分別對 name,age 進(jìn)行判斷是否相等

 

通過這兩個(gè)方法 , 在向 hashSet 調(diào)用 add 添加元素時(shí) , 就能準(zhǔn)確保證判斷元素是否存在

比較 hash 碼同時(shí)比較 equles 雙重保障去除重復(fù)元素


分享名稱:好程序員分享HashSet實(shí)現(xiàn)去除重復(fù)元素-創(chuàng)新互聯(lián)
文章地址:http://weahome.cn/article/hshje.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部