遍歷一個Set的方法只有一個:迭代器(interator)。


Set-HashSet實現類:

遍歷一個Set的方法只有一個:迭代器(interator)。

HashSet中元素是無序的(這個無序指的是數據的添加順序和后來的排列順序不同),而且元素不可重復。

Object中除了有final()toString()equals(),還有hashCode()

HashSet底層用的也是數組。

當向數組中利用add(Object o)添加對象的時候,系統先找對象的hashCode

int hc=o.hashCode(); 返回的hashCode為整數值。

Int I=hc%n;n為數組的長度),取得余數后,利用余數向數組中相應的位置添加數據,以n6為例,如果I=0則放在數組a[0]位置,如果I=1,則放在數組a[1]位置。如果equals()返回的值為true,則說明數據重復。如果equals()返回的值為false,則再找其他的位置進行比較。這樣的機制就導致兩個相同的對象有可能重復地添加到數組中,因為他們的hashCode不同。

如果我們能夠使兩個相同的對象具有相同hashcode,才能在equals()返回為真。

在實例中,定義student對象時覆蓋它的hashcode

因為String類是自動覆蓋的,所以當比較String類的對象的時候,就不會出現有兩個相同的string對象的情況。

現在,在大部分的JDK中,都已經要求覆蓋了hashCode

結論:如將自定義類用hashSet來添加對象,一定要覆蓋hashcode()equals(),覆蓋的原則是保證當兩個對象hashcode返回相同的整數,而且equals()返回值為True

如果偷懶,沒有設定equals(),就會造成返回hashCode雖然結果相同,但在程序執行的過程中會多次地調用equals(),從而影響程序執行的效率。

 

我們要保證相同對象的返回的hashCode一定相同,也要保證不相同的對象的hashCode盡可能不同(因為數組的邊界性,hashCode還是可能相同的)。例子:

public int hashCode(){

  return name.hashcode()+age;

}

這個例子保證了相同姓名和年齡的記錄返回的hashCode是相同的。

 

使用hashSet的優點:

hashSet的底層是數組,其查詢效率非常高。而且在增加和刪除的時候由於運用的hashCode的比較開確定添加元素的位置,所以不存在元素的偏移,所以效率也非常高。因為hashSet查詢和刪除和增加元素的效率都非常高。

但是hashSet增刪的高效率是通過花費大量的空間換來的:因為空間越大,取余數相同的情況就越小。HashSet這種算法會建立許多無用的空間。

使用hashSet接口時要注意,如果發生沖突,就會出現遍歷整個數組的情況,這樣就使得效率非常的低。

 

練習:new一個hashset,插入employee對象,不允許重復,並且遍歷出來。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM