集合collection 下List接口和Set接口

List 和Set 都是屬於collection下的子接口。


List 下面有ArrayList ,linkList,vector。實現類

List 不僅實現了collection中的方法還有自己方法。

而Set也只是實現了collection中的方法。


Set 下面有  hashSet,linkHashSet,treeSet


set 是無序的 ,list是有序的,這點只能從存儲上來說。

List 中存儲 是按數組來存的。所以可以按數組的思維

而Set 存儲方法  是用哈希算法的思維設計的。是不能添加重複的。

就是首先按照 所存儲的對象(obj)的哈西編碼,也就是hashCode();是不是一樣,一樣的話說明已經添加過了。

不一樣的話再按照 equals()方法。比較對象是否相同。相同則不添加。

上述2個添加條件 是並列的,需要都滿足!!才能進行添加。

所以如果要添加自定義類的話,需要滿足自定義類重寫 equals()和hashCode();用jvm自動生成就好。別亂寫!特別是hashCode()不然會出事。



而linkList 是鏈表 list存儲的時候是有用指針的。利用指針的話  可以實現添加高效率!只要改變指針指向就行了。


vector 這個實現類 是1.0版本出的。而List是1.2版本出的額。。。 所以說這個實現類太古老了。。棄用!!

hashSet 存儲當然也是無序的,遍歷的話也是按某種規則遍歷的。就像linkHashSet一樣遍歷是按照指針指向來遍歷的。

但需要注意的事後者遍歷的事維護了添加順序的。也就是說先添加先輸出。(排除中間插入的情況)。

而hashSet沒有先插入先輸出這樣子。


吶。。treeSet就比較難了。首先他添加的對象必須是同一類型的。!!!不然會報錯。

然後他添加的對象類型必須是實現了comparable接口的。

所以要添加自定義類的注意了。必須實現comparable接口,重寫compareTo()方法。

舉個例子 String 類型他已經是重寫了compareTo方法的。這個方法導致了他輸出時 是按照字母順序來輸出的。ABCD。。。。這樣子。

所以自定義類時 你重寫的東西一般是按照某種字段來排列。比如name。這時候name就是String類型的。你還是可以按照String的compareTo來寫

比如:return this.name.compareTo(p.name);//p添加的對象。但是要注意到的是 只按一個字段順序來排列會導致 此字段相同 其他字段不同的數據  添加不進來。被當做重複數據了。所以這裏應該要嚴謹。應該做多重排序。這樣才能避免錯誤。

總的來說:treeSet 要保持 comparable,equals,hashCode  3個方法一致,才能正常添加。。




心得體會。。。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章