Collection
Collection
- Collection:Collection接口是集合類(lèi)的根接口惧蛹,它有兩個(gè)接口香嗓,List是一個(gè)有序的集合,可以包含重復(fù)的元素,提供了按索引訪問(wèn)的方式迅诬,Set中不能包含重復(fù)的元素。
- List:List里存放的對(duì)象是有序的,同時(shí)也是可以重復(fù)的,List有一系列和索引相關(guān)的方法睬棚,查詢速度快。因?yàn)橥鵯ist集合里插入或刪除數(shù)據(jù)時(shí)害晦,會(huì)伴隨著后面數(shù)據(jù)的移動(dòng)鳄逾,所有插入刪除數(shù)據(jù)速度慢。
- Set:Set里存放的對(duì)象是無(wú)序汽摹,不能重復(fù)的,集合中的對(duì)象不按特定的方式排序圾旨,只是簡(jiǎn)單地把對(duì)象加入集合中。
- 哈希表:數(shù)組和單項(xiàng)鏈表的結(jié)合魏蔗,哈希表本質(zhì)是一數(shù)組砍的,只不過(guò)這個(gè)數(shù)組中的每一個(gè)元素又是單項(xiàng)鏈表。
Collection方法莺治,了解了Collection中的方法廓鞠,也就了解了其子類(lèi)的方法。
方法 | 解釋 |
---|---|
add() | 確保此 collection 包含指定的元素 |
addAl() | 將指定 collection 中的所有元素都添加到此 collection 中 |
clear() | 移除此 collection 中的所有元素 |
contains() | collection 包含指定的元素 |
equals() | 比較此 collection 與指定對(duì)象是否相等 |
isEmpty() | 如果此 collection 不包含元素 |
iterator() | 返回在此 collection 的元素上進(jìn)行迭代的迭代器 |
remove() | 移除指定元素的單個(gè)實(shí)例 |
removeAll() | 移除 collection 中包含在指定 collection 中的所有元素 |
toArray | 將集合轉(zhuǎn)換為數(shù)組 |
我們重點(diǎn)看iterator()谣旁,所有的集合類(lèi)床佳,都實(shí)現(xiàn)了Iterator接口,這是一個(gè)用于遍歷集合中元素的接口
Iterator it=c.iterator();//獲取迭代器
while(it.hasnext()){
it.next()//獲取對(duì)于的元素
}
Map
Map
- Map:Map是Java.util包中的另一個(gè)接口榄审,它和Collection接口沒(méi)有關(guān)系砌们,是相互獨(dú)立的,但是都屬于集合類(lèi)的一部分。Map包含了key-value對(duì)浪感。Map不能包含重復(fù)的key昔头,但是可以包含相同的value。
- HashMap :HashMap是最常用的Map影兽,它根據(jù)鍵的HashCode值存儲(chǔ)數(shù)據(jù)揭斧,根據(jù)鍵可以直接獲取它的值,具有很快的訪問(wèn)速度峻堰,遍歷時(shí)讹开,取得數(shù)據(jù)的順序是完全隨機(jī)的。因?yàn)殒I對(duì)象不可以重復(fù)捐名,所以HashMap最多只允許一條記錄的鍵為Null旦万,允許多條記錄的值為Null,是非同步的
- Hashtable:Hashtable與HashMap類(lèi)似桐筏,HashMap是線程安全的纸型,它支持線程的同步,即任一時(shí)刻只有一個(gè)線程能寫(xiě)Hashtable梅忌,因此也導(dǎo)致了Hashtale在寫(xiě)入時(shí)會(huì)比較慢狰腌,它繼承自Dictionary類(lèi),不同的是它不允許記錄的鍵或者值為null牧氮,同時(shí)效率較低琼腔。
- TreeMap:TreeMap實(shí)現(xiàn)SortMap接口,能夠把它保存的記錄根據(jù)鍵排序踱葛,默認(rèn)是按鍵值的升序排序(自然順序)丹莲,也可以指定排序的比較器,當(dāng)用Iterator遍歷TreeMap時(shí)尸诽,得到的記錄是排過(guò)序的甥材。不允許key值為空,非同步的性含;
- Properties:Properties 類(lèi)表示了一個(gè)持久的屬性集洲赵。Properties 可保存在流中或從流中加載。屬性列表中每個(gè)鍵及其對(duì)應(yīng)值都是一個(gè)字符串Properties 繼承于 Hashtable商蕴,所以可對(duì) Properties 對(duì)象應(yīng)用 put 和 putAll 方法叠萍。應(yīng)該使用 setProperty 方法。
Map方法绪商,了解了Map中的方法苛谷,也就了解了其子類(lèi)的方法。
方法 | 解釋 |
---|---|
clear() | 從此映射中移除所有映射關(guān)系 |
containsKey() | 如果此映射包含指定鍵的映射關(guān)系格郁,則返回 true |
containsValue() | 如果此映射將一個(gè)或多個(gè)鍵映射到指定值腹殿,則返回 true |
equals() | 比較指定的對(duì)象與此映射是否相等 |
get() | 返回指定鍵所映射的值独悴;如果此映射不包含該鍵的映射關(guān)系,則返回 null 赫蛇。 |
isEmpty() | 如果此映射未包含鍵-值映射關(guān)系 |
[keySe()t | 返回此映射中包含的鍵的 |
put() | 將指定的值與此映射中的指定鍵關(guān)聯(lián) |
putAll() | 從指定映射中將所有映射關(guān)系復(fù)制到此映射中 |
remove() | 如果存在一個(gè)鍵的映射關(guān)系绵患,則將其從此映射中移除 |
size() | 返回此映射中的鍵-值映射關(guān)系數(shù) |
通過(guò)迭代器遍歷集合
Iterator it = map.keySet().iterator();
//獲取迭代器
while(it.hasNext()){
Object key = it.next();
System.out.println(map.get(key));
}
總結(jié):
Vector和ArrayList
- vector是線程同步的,所以它也是線程安全的悟耘。arraylist是線程異步的落蝙,是不安全的,一般用arraylist效率比較高暂幼。
- 如果集合中的元素的數(shù)目大于目前集合數(shù)組的長(zhǎng)度時(shí)筏勒,vector增長(zhǎng)率為目前數(shù)組長(zhǎng)度的100%,而arraylist增長(zhǎng)率為目前數(shù)組長(zhǎng)度的50%旺嬉。如果在集合中使用數(shù)據(jù)量比較大的數(shù)據(jù)管行,用vector有一定的優(yōu)勢(shì)。
- 如果查找一個(gè)指定位置的數(shù)據(jù)邪媳,vector和arraylist使用的時(shí)間是相同的捐顷,如果頻繁的訪問(wèn)數(shù)據(jù),這個(gè)時(shí)候使用vector和arraylist都可以雨效。而如果移動(dòng)一個(gè)指定位置會(huì)導(dǎo)致后面的元素都發(fā)生移動(dòng)迅涮,這個(gè)時(shí)候就應(yīng)該考慮到使用linklist,因?yàn)樗苿?dòng)一個(gè)指定位置的數(shù)據(jù)時(shí)其它元素不移動(dòng)。
- ArrayList 和Vector是采用數(shù)組方式存儲(chǔ)數(shù)據(jù)徽龟,此數(shù)組元素?cái)?shù)大于實(shí)際存儲(chǔ)的數(shù)據(jù)以便增加和插入元素叮姑,都允許直接序號(hào)索引元素,但是插入數(shù)據(jù)要涉及到數(shù)組元素移動(dòng)等內(nèi)存操作据悔,所以索引數(shù)據(jù)快传透,插入數(shù)據(jù)慢,Vector由于使用了synchronized方法(線程安全)所以性能上比ArrayList要差极颓,LinkedList使用雙向鏈表實(shí)現(xiàn)存儲(chǔ)朱盐,按序號(hào)索引數(shù)據(jù)需要進(jìn)行向前或向后遍歷,但是插入數(shù)據(jù)時(shí)只需要記錄本項(xiàng)的前后項(xiàng)即可菠隆,所以插入數(shù)度較快托享。
arraylist和linkedlist
- ArrayList是實(shí)現(xiàn)了基于動(dòng)態(tài)數(shù)組的數(shù)據(jù)結(jié)構(gòu),LinkedList基于鏈表的數(shù)據(jù)結(jié)構(gòu)浸赫。
- 對(duì)于隨機(jī)訪問(wèn)get和set,ArrayList覺(jué)得優(yōu)于LinkedList赃绊,因?yàn)長(zhǎng)inkedList要移動(dòng)指針既峡。
- 對(duì)于新增和刪除操作add和remove,LinedList比較占優(yōu)勢(shì)碧查,因?yàn)锳rrayList要移動(dòng)數(shù)據(jù)运敢。 這一點(diǎn)要看實(shí)際情況的校仑。若只對(duì)單條數(shù)據(jù)插入或刪除,ArrayList的速度反而優(yōu)于LinkedList传惠。但若是批量隨機(jī)的插入刪除數(shù)據(jù)迄沫,LinkedList的速度大大優(yōu)于ArrayList. 因?yàn)锳rrayList每插入一條數(shù)據(jù),要移動(dòng)插入點(diǎn)及之后的所有數(shù)據(jù)卦方。
HashMap與TreeMap
- HashMap通過(guò)hashcode對(duì)其內(nèi)容進(jìn)行快速查找羊瘩,而TreeMap中所有的元素都保持著某種固定的順序,如果你需要得到一個(gè)有序的結(jié)果你就應(yīng)該使用TreeMap(HashMap中元素的排列順序是不固定的)盼砍。
- 在Map 中插入尘吗、刪除和定位元素,HashMap是最好的選擇浇坐。但如果您要按自然順序或自定義順序遍歷鍵睬捶,那么TreeMap會(huì)更好。使用HashMap要求添加的鍵類(lèi)明確定義了hashCode()和 equals()的實(shí)現(xiàn)近刘。
兩個(gè)map中的元素一樣擒贸,但順序不一樣,導(dǎo)致hashCode()不一樣觉渴。
同樣做測(cè)試:
在HashMap中介劫,同樣的值的map,順序不同,equals時(shí)疆拘,false;
而在treeMap中蜕猫,同樣的值的map,順序不同,equals時(shí),true哎迄,說(shuō)明回右,treeMap在equals()時(shí)是整理了順序了的。
HashTable與HashMap
- 同步性:Hashtable是線程安全的漱挚,也就是說(shuō)是同步的翔烁,而HashMap是線程序不安全的,不是同步的旨涝。
- HashMap允許存在一個(gè)為null的key蹬屹,多個(gè)為null的value 。
- hashtable的key和value都不允許為null白华。