參考:https://mp.weixin.qq.com/s/TE225z9vKrq_DmLE_QciKA函數
只見一塵號召了全部的弟子,把他們的名字都添加到他本身構造出的一個List集合裏面去了。3d
這裏一塵選擇了 ArrayListorm
而後用 contains() 方法判斷輸入的那個名字在沒在 List 集合裏。cdn
結果:
對象
HashSet 它實現了 Set 接口,而Set集合的特性就是沒有重複元素,因此他能夠自動的去掉重複元素。而且它的底層是使用 散列表來實現的,因此它的一些經常使用操做。blog
好比:添加元素add(),移除元素remove(),是否包含某個元素contains()的時間複雜度都爲O(1)
到時候每查一我的,你只須要判斷它在沒在集合裏,你能夠用 contains() 來判斷。
和List在使用上沒有多大區別,把List換成Set就行。
HashSet會自動幫你去重。
能夠看到,它的構造函數實際上是new了一個HashMap。
這個map是HashSet的一個成員變量
HashMap底層使用了散列表,因此速度很快
能夠看到,在用HashSet的add()方法的時候,其實就是將你要add的元素 e 做爲 HashMap的 Key,把 PRESENT 做爲Value進行存儲的。
而 PRESENT 是一個固定不變的 Object
元素被 add 進 HashSet 中的樣子是這樣的:
HashSet容量爲 8
當 HashSet 被add()進兩個相同的元素的時候,此時 HashMap 中以前存在的Key不會發生改變。
只是 Value 被替換了,而後就return了。這樣也就達到了去重的目的(第二個重複的Key沒有被添加進來)。
此段代碼在HashMap的 put() 方法之中
而後再主程序中加入到Set中就好了。
看一下下面的代碼:
兩個名字和性別都同樣的學生,按理來講應該是同一我的了(邏輯上同樣),可是它的 set 集合輸出卻有兩個一塵,都是男的,沒有去重。
能夠看到 會調用 k 的hashCode. k就是你add進去的 Key,對 Key不重寫hashCode就會默認調用父類Object的hashCode方法。
而 Object 的 hashCode 是 native 的,這個 hashCode 根據虛擬機的策略可能會返回和對象地址相關聯的值。
你上面new的兩個Student雖然邏輯上同樣,可是兩個對象的地址不同,因此它們的hashCode可能會根據地址來計算,就會產生不一樣的hashCode,從而落在了不一樣的位置(桶)中了。
由於key在被put進map中的時候,它到底落在哪一個位置(桶)是由它的hashCode決定的。
HashMap中的put方法
這裏能夠看到,就算你的兩個對象的hashCode同樣(e.hash==hash),落在了同一個位置(桶),可是若是你不重寫equals方法,那麼在判斷HashMap集合裏是否存在相同的元素的時候,就會根據Object的equals方法來判斷。
能夠看到Object的equals是比較的對象的地址,而你new了兩個對象,他們的地址不同,因此這裏就不 return,而是把你的邏輯相同的Student加入到 HashMap之中。
這樣仍是有重複元素。
只見慧能隨手一寫: