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個方法一致,才能正常添加。。
心得體會。。。