集合:
1,是可以存儲很多元素的容器。
2,這個容器用于存儲對象。
3,而且該容器的長度是可變的。
集合和數(shù)組的區(qū)別:
1,
數(shù)組是固定長度,
集合是可變長度。
2,
數(shù)組可以存儲引用類型,也可以存儲基本類型。
集合只能存儲引用類型。
集合框架的由來:
集合有很多種,因為每一個集合中的數(shù)據(jù)結構(數(shù)據(jù)在容器中存取的具體的方式)都不一樣。
但都具備共性功能,就不斷地向上抽取。就形成了集合框架。該框架的頂層Collection接口。
學習框架原則:看頂層,用底層。
了解一下api中的Collection中的共性方法。
Collection中的共性方法:
1,添加:
add(Object)
addAll(collection)
2,刪除:
remove(object)
removeAll(collection)
clear();
retainAll(collection);
3,判斷:
contains(object)
containsAll(collection)
isEmpty();
4,獲取:
size();
iterartor();獲取迭代器。每一個集合都具備。
5,轉換
toArray(); 將集合轉成數(shù)組。
迭代器的使用:
for(Iterator it = collection.iterator(); it.hasNext() ; ){
System.out.println(it.next());
}
迭代器:是容器中的一個內部類,因為該類要直接訪問容器中的元素。
同時對外提供了公共的訪問規(guī)則Iterator接口。
這樣的好處,不需要知道具體的容器,只要是Collection中的容器
都可以通過該種取出方法取出體系中的所有容器中的元素。
降低了具體容器和取出方式的耦合性。
想要獲取集合中的迭代器對象,就可以通過iterator方法來完成。
Collection
- List :有序的(存入的順序和取出的順序保持一致),該集合中的元素都有索引,可以有重復元素。
- Set :不允許有重復元素。
List:特有方法:都是圍繞的索引展開的。
1,添加:
add(index,element);
add(index,collection);
2,獲取:
get(index):通過角標獲取元素。
indexOf(object);
lastIndexOf(object);
subList(fromindex,toindex);
3,刪除:
remove(index):通過角標刪除元素,并返回被刪除的元素。
4,修改:
set(index,element);
5,特有的迭代器。ListIterator。可以在迭代時進行元素的增刪改查。
List具備著對容器中的元素進行增刪改查的功能。只有該集合有。為啥呢?因為索引。
List
- Vector:底層數(shù)據(jù)結構是一個數(shù)組。 而且數(shù)組可以增長。其實數(shù)組增長的原理:存儲元素時,超出數(shù)組角標,會創(chuàng)建新數(shù)組,將原數(shù)組的數(shù)據(jù)復制到新數(shù)組中,并將新元素存儲到新數(shù)組中。它是同步的。效率非常低。
- ArrayList:底層數(shù)據(jù)結構也是可變長度的數(shù)組,是不同步的,比Vector效率高。查詢元素的速度很快。
- LinkedList:底層數(shù)據(jù)結構是鏈表數(shù)據(jù)結構,是不同步的。對元素的增刪操作很快。
Set
- HashSet:數(shù)據(jù)結構是哈希表,是不同步的。
- TreeSet:數(shù)據(jù)結構是二叉樹結構。是不同步的。可以對Set集合中的元素進行指定方式的排序。默認用的元素的自然排序。
Collection集合的子類對象閱讀技巧。
具體的容器是什么結構?是否是同步?
通過名稱就可以獲得。容器的前綴名是數(shù)據(jù)結構的名字。后綴名是所屬體系的名字。
凡是后綴名是體系名的集合,通常都是不同步的。
- ArrayList:數(shù)據(jù)結構是數(shù)組。所屬于List體系。看到數(shù)組必須想到索引,必須要知道查詢速度快。
- LinkedList:數(shù)據(jù)結構是鏈表,看到鏈表就要想到,增刪速度快,而且要接的 add,get,remove的first last方法。
- HashSet:數(shù)據(jù)結構是哈希表,看到哈希就必須想到對元素進行hashCode和equals方法的復寫。
- TreeSet:數(shù)據(jù)結構是二叉樹,看到樹,就要想到比較排序,就要想到兩個接口,Comparable Comparator。
(二叉樹結構也叫紅黑結構左紅右黑)默認元素的自然排序。可以對Set集合中的元素進行指定方式的排序。TreeSet判斷元素唯一性的方式是比較方法的返回值是否為0,如果是0視為元素相同,不存。如果比較時主要條件相同就要看次要條件。弊端是不能存重復的
哈希表提升了查詢速度,并保證了元素的唯一性,元素不唯一性會破壞表結構。
如果哈希值不同,直接存。如果哈希值相同,要進一步判斷內容是否相同,用的是equals方法,如果equals返回true是相同元素則不存。如果返回false,不相同,則存儲
元素要往哈希表結構的容器中存儲,必須具備hashCode和equals方法,Object中已經(jīng)提供了這兩個方法。堆內存(存數(shù)據(jù),對象)用的數(shù)據(jù)就是哈希表。因為對象的自身特點不同,有可能哈希算法的依據(jù)也不同。所以有可能要覆蓋hashCode方法。Object的hashCode方法是本地方法調用的是windows的底層算法 幾乎很少有沖突,,所以就沒法保證唯一性,所以要定義自己的算法來覆蓋。
技巧:為了保證唯一 一般在age后乘以一個數(shù),因為很有可能兩個人名字不同年齡不同但是算出的哈希值相同,這樣會多判斷一次equals,equals進棧會低效,所以為保證性能與唯一
乘以個數(shù)。。。。
TreeSet 不讓它自動排序 可以控制return值 存入順序和取出順序一致則return正數(shù) 存入順序和取出順序相反return負數(shù)。
TreeSet判斷元素唯一性的方式,是比較方法的返回值是否為0.如果是0,視為元素相同,不存。
排序方式有兩種:
1,讓元素自身具備比較性,該元素需要實現(xiàn)Comparable接口,覆蓋compareTo方法。讓元素具備了自然排序。該種方式有弊端,如果元素自身具備的自然排序不是所需要的,怎么辦?還有,萬一元素根本就不具備自然排序怎么辦?
2,可以讓容器自身具備比較性,而且應該添加元素之前。所以應該在容器對象創(chuàng)建時,就必須明確比較性。那就應該參考該容器的構造函數(shù)。發(fā)現(xiàn)可以指定一個比較器,定義一個Comparator接口的子類,并覆蓋compare方法。將Comparator接口的子類對象作為參數(shù)傳遞給TreeSet集合的構造函數(shù)。
數(shù)據(jù)結構:數(shù)據(jù)存取的方式結構
兩種數(shù)據(jù)結構:
堆棧:先進后出First In Last Out (FILO)
隊列:先進先出First In First Out (FIFO)
既要速度快 又要有序 可以選擇LinkedHashSet
Map
Map實現(xiàn)類用于保存具有映射關系的數(shù)據(jù)。Map保存的每項數(shù)據(jù)都是key-value對,也就是由key和value兩個值組成。Map里的key是不可重復的,key用戶標識集合里的每項數(shù)據(jù)。同一個Map對象的任何兩個key通過equals方法比較總是返回false。
HashMap,TreeMap是我們經(jīng)常會用到的集合類。
Map集合與Set集合、List集合的關系
1.與Set集合的關系
如果 把Map里的所有key放在一起看,它們就組成了一個Set集合(所有的key沒有順序,key與key之間不能重復),實際上Map確實包含了一個keySet()方法,用戶返回Map里所有key組成的Set集合。
2.與List集合的關系
如果把Map里的所有value放在一起來看,它們又非常類似于一個List:元素與元素之間可以重復,每個元素可以根據(jù)索引來查找,只是Map中索引不再使用整數(shù)值,而是以另外一個對象作為索引。
怎樣決定何時使用HashMap何時使用TreeMap?
對 于插入、刪除、定位元素頻繁的操作,HashMap提供了最好的效率。如果想要按key的排序來遍歷,那么TreeMap是不二選擇。某些情況下,依賴集 合的大小,先向HashMap中添加元素,然后轉換為TreeMap再按key的排序進行遍歷也許會帶來效率上的提高。
HashMap
HashMap的數(shù)據(jù)結構:
數(shù)組的特點是:尋址容易,插入和刪除困難;
而鏈表的特點是:尋址困難,插入和刪除容易。
哈希表結合了兩者的優(yōu)點。
哈希表有多種不同的實現(xiàn)方法,可以理解將此理解為“鏈表的數(shù)組”
HashTable與HashMap的區(qū)別
HashTable和HashMap存在很多的相同點,但是他們還是有幾個比較重要的不同點。
我們從他們的定義就可以看出他們的不同,HashTable基于Dictionary類,而HashMap是基于AbstractMap。Dictionary是什么?它是任何可將鍵映射到相應值的類的抽象父類,而AbstractMap是基于Map接口的骨干實現(xiàn),它以最大限度地減少實現(xiàn)此接口所需的工作。
HashMap可以允許存在一個為null的key和任意個為null的value,但是HashTable中的key和value都不允許為null。如下:當HashMap遇到為null的key時,它會調用putForNullKey方法來進行處理。對于value沒有進行任何處理,只要是對象都可以。
Hashtable的方法是同步的,而HashMap的方法不是。所以有人一般都建議如果是涉及到多線程同步時采用HashTable,沒有涉及就采用HashMap,但是在Collections類中存在一個靜態(tài)方法:synchronizedMap(),該方法創(chuàng)建了一個線程安全的Map對象,并把它作為一個封裝的對象來返回,所以通過Collections類的synchronizedMap方法是可以我們你同步訪問潛在的HashMap。
遍歷不同:HashMap僅支持Iterator的遍歷方式,Hashtable支持Iterator和Enumeration兩種遍歷方式。