好程式設計師分享HashSet實現去除重複元素
好程式設計師 分享 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 雙重保障去除重複元素
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69913892/viewspace-2649447/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 使用HashSet<>去除重複元素的集合
- 好程式設計師Java培訓分享treeset和hashset的區別程式設計師Java
- 好程式設計師分享居中一個float元素程式設計師
- 好程式設計師web前端分享CSS元素型別程式設計師Web前端CSS型別
- 好程式設計師web前端分享js實現實戰案例程式設計師Web前端JS
- 好程式設計師web前端分享CSS不同元素margin的計算程式設計師Web前端CSS
- js 的陣列去除重複元素程式碼例項JS陣列
- javascript去除陣列中重複元素程式碼例項JavaScript陣列
- 好程式設計師web前端培訓系列分享css偽元素的實用技巧程式設計師Web前端CSS
- PHP陣列去除空白或重複元素PHP陣列
- 好程式設計師web前端分享HTML元素強制不換行程式設計師Web前端HTML
- 好程式設計師分享Linux重器vi編輯器程式設計師Linux
- 小測試:HashSet可以插入重複的元素嗎?
- JAVA 如何實現大文字去除重複行Java
- 如何去除有序陣列中的重複元素陣列
- 使用jQuery去除陣列中的重複元素程式碼例項jQuery陣列
- 好程式設計師分享JavaScrip陣列去重操作例項小結程式設計師Java陣列
- 好程式設計師Java培訓分享Java程式設計技巧程式設計師Java
- VUE的面試題分享-好程式設計師Vue面試題程式設計師
- 好程式設計師Java教程分享List介面程式設計師Java
- 好程式設計師Java教程分享javaweb框架程式設計師JavaWeb框架
- 好程式設計師Java培訓分享Java程式設計師技能提升指南程式設計師Java
- 好程式設計師Java教程分享Java之設計模式程式設計師Java設計模式
- 一句程式碼搞定陣列去重(去除陣列中的重複元素)陣列
- 好程式設計師web前端培訓分享CSS3實現全景圖特效程式設計師Web前端CSSS3特效
- Java實現-帶重複元素的子集Java
- 好程式設計師Python培訓分享Python程式設計師面試技巧程式設計師Python面試
- Java基礎之去除List集合中的重複元素Java
- 好程式設計師Java教程分享Java面試妙招程式設計師Java面試
- 好程式設計師分享JavaScript建立物件的方式!程式設計師JavaScript物件
- 好程式設計師分享Web前端開發工具程式設計師Web前端
- 好程式設計師Java教程分享Java語法程式設計師Java
- 好程式設計師Web前端分享前端CSS篇程式設計師Web前端CSS
- 好程式設計師web前端教程分享CSS技巧!程式設計師Web前端CSS
- 好程式設計師分享WebService的簡單使用程式設計師Web
- 好程式設計師Java分享SQL語言之索引程式設計師JavaSQL索引
- 好程式設計師web前端分享Cookie知識程式設計師Web前端Cookie
- 好程式設計師分享java設計模式之享元模式程式設計師Java設計模式