集合類的由來:
對象用於封裝特有數據,對象多了須要存儲,若是對象的個數不肯定。
就使用集合容器進行存儲。
集合特色:
1,用於存儲對象的容器。
2,集合的長度是可變的。
3,集合中不能夠存儲基本數據類型值。 算法
集合容器由於內部的數據結構不一樣,有多種具體容器。
不斷的向上抽取,就造成了集合框架。數組
框架的頂層Collection接口:安全
Collection的常見方法:數據結構
1,添加。
boolean add(Object obj):
boolean addAll(Collection coll):
框架
2,刪除。
boolean remove(object obj):
boolean removeAll(Collection coll);
void clear();
3,判斷:
boolean contains(object obj):
boolean containsAll(Colllection coll);
boolean isEmpty():判斷集合中是否有元素。 函數
4,獲取:
int size():
Iterator iterator():取出元素的方式:迭代器。
該對象必須依賴於具體容器,由於每個容器的數據結構都不一樣。
因此該迭代器對象是在容器中進行內部實現的。
對於使用容器者而言,具體的實現不重要,只要經過容器獲取到該實現的迭代器的對象便可,
也就是iterator方法。
Iterator接口就是對全部的Collection容器進行元素取出的公共接口。
其實就是抓娃娃遊戲機中的夾子!
5,其餘:
boolean retainAll(Collection coll);取交集。
Object[] toArray():將集合轉成數組。
code
-------------------------------
Collection
|--List:有序(存入和取出的順序一致),元素都有索引(角標),元素能夠重複。
|--Set:元素不能重複,無序。對象
List:特有的常見方法:有一個共性特色就是均可以操做角標。
1,添加
void add(index,element);
void add(index,collection);排序
2,刪除;
Object remove(index):索引
3,修改:
Object set(index,element);
4,獲取:
Object get(index);
int indexOf(object);
int lastIndexOf(object);
List subList(from,to);
list集合是能夠完成對元素的增刪改查。
List:
|--Vector:內部是數組數據結構,是同步的。增刪,查詢都很慢!
|--ArrayList:內部是數組數據結構,是不一樣步的。替代了Vector。查詢的速度快。
|--LinkedList:內部是鏈表數據結構,是不一樣步的。增刪元素的速度很快。
set:
|--hashSet:內部結構是哈希表,是不一樣步的
如何保證集合元素中的惟一性呢?
是經過對象的hashCode方法和equals方法來判斷對象的惟一性的
若是對象的哈希值不一樣,那麼就直接存入哈希表中
若是哈希值相同,那麼去判斷equals是否相同,
若是都相同,那麼就會被視爲相同的元素,若是不一樣,在以哈希算法存到哈希表中
記住:若是元素要存儲到HashSet集合中,必須覆蓋hashCode方法和equals方法。
通常狀況下,若是定義的類會產生不少對象,好比人,學生,書,一般都須要覆蓋equals,hashCode方法。
創建對象判斷是否相同的依據。
|--treeSet:內部結構是二叉樹,是不一樣步的
判斷元素惟一性的方法就是比較,根據比較方法若是返回的值爲0,就是相同元素
TreeSet對元素的排列方式之一:
就是讓元素本身具有比較功能,那麼元就是對象就要實現Comparable接口覆蓋compareto方法
若是不要按照對象中具有的天然順序進行排序。若是對象中不具有天然順序。怎麼辦?
可使用TreeSet集合第二種排序方式二:
讓集合自身具有比較功能,定義一個類實現Comparator接口,覆蓋compare方法。
將該類對象做爲參數傳遞給TreeSet集合的構造函數。
泛型:
jdk1.5出現的機制
好處:
1.將運行時期的classcastException轉換到了編譯時期
2.避免了類型的轉換
<>何時使用呢? 當你存儲數據類型不肯定的時候就須要用<>
在程序中,只要用到了帶有<>的類或者接口,就要明確傳入的具體引用數據類型 。
泛型技術是給編譯器使用的技術,用於編譯時期。確保了類型的安全。
運行時,會將泛型去掉,生成的class文件中是不帶泛型的,這個稱爲泛型的擦除。
爲何擦除呢?由於爲了兼容運行的類加載器。
泛型的補償:在運行時,經過獲取元素的類型進行轉換動做。不用使用者在強制轉換了。
泛型的限定:
? extends E: 接收E類型或者E的子類型對象。上限
通常存儲對象的時候用。好比 添加元素 addAll.
? super E: 接收E類型或者E的父類型對象。 下限。
通常取出對象的時候用。好比比較器。
--------------------------------
集合的一些技巧:
須要惟一嗎?
須要:Set
須要指定順序嗎?
須要:TreeSet:須要添加元素的比較或者添加比較器
不須要:HashSet:須要比較兩個元素,重寫hashcode和equals方法
想要一個存儲有序的順序:linkedHashSet
不須要:List
須要頻繁增刪嗎?
須要:LinkedList:是以鏈表數據結構存儲的集合,增刪快
須要頻繁查找嗎?
須要:ArrayList:是以數組數據結構存儲的集合,查找快
如何記錄容器的結構和所屬的體系呢?
List
|--ArrayList
|--LinkedList
Set
|--HashSet
|--TreeSet
前綴就是數據結構,後綴就是集合所屬的體系
看到array:就要想到數組,就要想到查詢快,有角標.
看到link:就要想到鏈表,就要想到增刪快,就要想要 add get remove+frist last的方法
看到hash:就要想到哈希表,就要想到惟一性,就要想到元素須要覆蓋hashcode方法和equals方法。
看到tree:就要想到二叉樹,就要想要排序,就要想到兩個接口Comparable,Comparator 。
並且一般這些經常使用的集合容器都是不一樣步的。
------------------------------- map: 一次添加一對元素,colleciton一次添加一個元素 map的鍵是惟一的 map的經常使用的子類 |--HashTable :內部結構是哈希表。是同步的 |--Properties:用來存儲鍵值對型的配置文件的信息,能夠和IO技術相結合。 |--HashMap: 內部結構是哈希表,是不一樣步的 |--TreeMap:內部結構是二叉樹,不一樣步的,能夠對map中的鍵進行排序 Arrays.aslist 把一個數組轉換成一個list list.toarray(size)把一個list轉換成一個數組,可是必須指定其長度