我們知道用於存儲對象的容器有數組,也有集合。既然有了數組,爲什麼又出現集合呢?下面先說說它們的區別。
集合與數組的區別:
1:數組是固定長度的,集合是可變長度的。
2:數組可以存儲基本數據類型,也可以存儲引用數據類型;集合只能存儲引用數據類型。
3:數組存儲的元素必須是同一個數據類型;集合存儲的對象可以是不同數據類型。
對於集合容器,有很多種。因爲每一個容器的自身特點不同。其實原理在於每個容器的內部結構不同。集合容器在不斷向上抽取過程中。出現了集合體系。
集合體系:
List:有序(元素存入集合的順序和取出的順序一致),元素都有索引。元素可以重複。
|--ArrayList:底層的數據結構是數組,線程不同步,ArrayList替代了Vector,查詢元素的速度非常快。
|--LinkedList:底層的數據結構是鏈表,線程不同步,增刪元素的速度非常快。
|--Vector:底層的數據結構就是數組,線程同步的,Vector無論查詢和增刪都巨慢。
List集合因爲角標有了自己的獲取元素的方式: 遍歷。
for(int x=0; x<list.size();x++){
sop("get:"+list.get(x));
}
Set接口中的方法和Collection中方法一致的。Set接口取出方式只有一種,迭代器。
|--HashSet:底層數據結構是哈希表,線程是不同步的。無序,高效;
HashSet集合保證元素唯一性:通過元素的hashCode方法,和equals方法完成的。
當元素的hashCode值相同時,才繼續判斷元素的equals是否爲true。
如果爲true,那麼視爲相同元素,不存。如果爲false,那麼存儲。
如果hashCode值不同,那麼不判斷equals,從而提高對象比較的速度。
|--LinkedHashSet:有序,hashset的子類。
|--TreeSet:對Set集合中的元素的進行指定順序的排序。不同步。TreeSet底層的數據結構就是二叉樹。
對於ArrayList集合,判斷元素是否存在,或者刪元素底層依據都是equals方法。
對於HashSet集合,判斷元素是否存在,或者刪除元素,底層依據的是hashCode方法和equals方法。
TreeSet集合排序有兩種方式,Comparable和Comparator區別:
1:讓元素自身具備比較性,需要元素對象實現Comparable接口,覆蓋compareTo方法。
2:讓集合自身具備比較性,需要定義一個實現了Comparator接口的比較器,並覆蓋compare方法,並將該類對象作爲實際參數傳遞給TreeSet集合的構造函數。
第二種方式較爲靈活。
Map集合:
|--Hashtable:底層是哈希表數據結構,是線程同步的。不可以存儲null鍵,null值。
|--HashMap:底層是哈希表數據結構,是線程不同步的。可以存儲null鍵,null值。替代了Hashtable.
|--TreeMap:底層是二叉樹結構,可以對map集合中的鍵進行指定順序的排序。
Map集合存儲和Collection有着很大不同:
Collection一次存一個元素;Map一次存一對元素。
Collection是單列集合;Map是雙列集合。
Map中的存儲的一對元素:一個是鍵,一個是值,鍵與值之間有對應(映射)關係。
特點:要保證map集合中鍵的唯一性。
而在開發中,集合通常和泛型一起使用。泛型是當類中的操作的引用數據類型不確定的時候,以前用的Object來進行擴展的,現在可以用泛型來表示。這樣可以避免強轉的麻煩,而且將運行問題轉移到的編譯時期。