您好,登錄后才能下訂單哦!
好程序員 分享 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 雙重保障去除重復元素
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。