Java集合Set、Map、HashSet、HashMap、TreeSet、TreeMap等
1、Set和Map的關系:
Set代表一種集合元素無序、不可重復的集合,Map代表一種由多個key-value對組成的集合。
Set的集合繼承體系:
Map關系集合
Map集合的key特征:所有key不能重復,key之間沒有順序。Map集合的所有key將具有set集合的特征。
對Set做改造可將Set改造成Map集合;
2、HashSet和HashMap的區別和聯系:
對於HashSet,系統采用Hash算法決定集合元素的存儲位置;對於HashMap,系統將value當成key的附屬物,系統根據hash算法決定key的存儲位置,value總是緊隨key存儲。
HashSet通過封裝一個HashMap對象來存儲所有的集合元素,所有放入HashSet中的集合元素實際上由HashMap的key來保存,而HashMap的value則存儲了一個PERSENT,它是一個靜態的Object對象。
HashSet的add()方法添加元素時實際上轉變為調用HashMap的put()方法來添加key-value對,當新放入的hashmap的Entry中的key與集合中原有的Entry的key相同(hashCode()返回值相等,通過equals比較也返回true)時,新添加的Entry的value將覆蓋原來Entry的value,但key不會有任何改變。如果向hashSet中添加一個已經存在的元素,新添加的集合元素不會覆蓋已有的集合元素。
3、TreeMap和TreeSet的區別和聯系:
TreeSet底層采用一個NavigableMap來保存TreeSet集合的元素,NavigableMap是一個接口,底層使用TreeMap來保存Set集合中的所有元素。TreeSet裏絕大部分方法都是直接調用TreeMap方法來實現。
TreeMap采用一種被稱為“紅黑權”的排序二叉樹來保存Map中的每個Entry——每個Entry都被當成紅黑樹的一個節點來對待。向TreeMap添加元素時,系統都要將該Entrty當成一個新節點,保證TreeMap中所有key總是由小到大排列的。TreeMap添加元素、取出元素的性能都比HashMap低。
4、Map和List
Map集合是一個關聯數組,包含兩組值,key組成的集合可以組成一個set集合,value組成的集合可以組成List集合。
Map接口提供get(K key)方法,允許Map對象根據key來獲取value;
List接口提供get(int index)方法,允許List對象根據元素索引來取得value;
List相當於所有key都是int型的Map,也可以說Map相當於索引是任意類型的List;
5、ArrayList和LinkedList
List集合的實現類有三個:ArrayList、Vector和LinkedList。Vector還有一個Stack子類,Stack在Vector父類的基礎上增加了五個方法。Stack是一個線程安全的類,Vector也是一個線程安全的類。
從序列化機制角度看,ArrayList的實現比Vector的實現更安全,Vector是ArrayList的線程安全版本。
當取元素時ArrayList性能大大優於LinkedList,因為ArrayList底層以數組來保存集合元素。當程序需要添加或刪除元素時,ArrayList必須對底層數組元素整體移動,如果添加元素導致集合長度超過底層數組長度,ArrayList必須創建一個長度為原來1.5倍的數組,再由垃圾回收機制回收原有數組,開銷較大。LinkedList,在插入刪除元素上,性能高於ArrayList。
6、叠代器接口Iterator
用於叠代各種Collection集合,用iterator()方法返回一個Iterator用於遍歷該集合中的元素。用remove()方法刪除剛叠代的集合元素。
Java集合Set、Map、HashSet、HashMap、TreeSet、TreeMap等