好程序員 分享 HashSet 實(shí)現(xiàn)去除重復(fù)元素 , 首先 HashSet 當(dāng)中有自己封裝了 add 方法
創(chuàng)新互聯(lián)于2013年成立,是專(zhuān)業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站建設(shè)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元沈北新做網(wǎng)站,已為上家服務(wù),為沈北新各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話(huà):13518219792public 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 用來(lái)匹配 Map 中后面的對(duì)象的一個(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<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;
} 這個(gè)方法均為封裝并直接能調(diào)用 add 方法使用
由此可見(jiàn) for 循環(huán) , 遍歷 table 的元素
1. 由于 hash 碼值的不同 , 證明是新元素 , 就直接保存其中
如果沒(méi)有元素和傳入值的 hash 相等則判定為元素在 table 不存在 , 也直接保存添加到 table 內(nèi)
2. 如果 hash 碼值相同 , 切 equles 判斷相等 , 證明元素存在 , 則舍棄
3. 如果 hash 碼值相同 , 且 equles 判斷不相等 , 證明元素不存在 , 則添加
如果元素和傳入值 hash 相等 , 接下來(lái)會(huì)調(diào)用 equles 方法判斷 , 依然相等的會(huì)認(rèn)為已經(jīng)存在的元素
不添加并結(jié)束 , 否則繼續(xù)添加
由此 hashcode() 和 equles() 是核心關(guān)鍵點(diǎn)
hash 值是什么
可以通過(guò)對(duì)象的成員變量計(jì)算出來(lái)
成員數(shù)值相加計(jì)算并獲取 hash 值
類(lèi)中重寫(xiě)方法示例 :
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)閷?duì)象的 name,age 有所不同導(dǎo)致相加計(jì)算結(jié)果也會(huì)不同
但是有可能存在對(duì)象成員變量不同 ,hash 碼相同的情況
因?yàn)楸仨氃僦貙?xiě)另外一個(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)分別對(duì) name,age 進(jìn)行判斷是否相等
通過(guò)這兩個(gè)方法 , 在向 hashSet 調(diào)用 add 添加元素時(shí) , 就能準(zhǔn)確保證判斷元素是否存在
比較 hash 碼同時(shí)比較 equles 雙重保障去除重復(fù)元素
本文名稱(chēng):好程序員分享HashSet實(shí)現(xiàn)去除重復(fù)元素-創(chuàng)新互聯(lián)
當(dāng)前路徑:http://muchs.cn/article24/hshje.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設(shè)、網(wǎng)站制作、面包屑導(dǎo)航、網(wǎng)站建設(shè)、搜索引擎優(yōu)化、微信公眾號(hào)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容