一? .概述


說明:?
1.list接口和set接口繼承自collection接口,Map是獨立接口
2.List下有ArrayList,Vector,LinkedList
3.Set下有HashSet,LinkedHashSet,TreeSet
4.Map下有Hashtable,LinkedHashMap,HashMap,TreeMap
二 .List
存放有序,可重復(fù)元素
1.ArrayList

(1)?? ArrayList數(shù)組線性表的特點為:類似數(shù)組的形式進行存儲,因此它的隨機訪問速度極快
(2)? ?ArrayList數(shù)組線性表的缺點為:不適合于在線性表中間需要頻繁進行插入和刪除操作。因為每次插入和刪除都需要移動數(shù)組中的元素
(3)? ?如果在初始化ArrayList的時候沒有指定初始化長度的話,默認的長度為10
(4)? ?ArrayList在增加新元素的時候如果超過了原始的容量的話,ArrayList擴容ensureCapacity方案為“原始容量*3/2"
(5)? ArrayList是線程不安全的,在多線程的情況下不要使用,如果要在多線程下使用可以使vector,用法基本一致 區(qū)別在于Vector中的絕大部分方法都使用了同步關(guān)鍵字修飾,這樣在多線程的情況下不會出現(xiàn)并發(fā)錯誤 ArrayList是通過原始?容量*3/2+1而Vector是允許設(shè)置默認的增長長度Vector的默認擴容方式為原來的2倍
(6) 在用迭代器遍歷一個集合對象時,如果遍歷過程中對集合對象的內(nèi)容進行了修改(增加、刪除、修改),則會拋出ConcurrentModificationException;為了防止刪除時出現(xiàn)這個問題,使用Iterator中的remove方法
2.LinkedList

(1)? LinkedList的鏈式線性表的特點為:?適合于在鏈表中間需要頻繁進行插入和刪除操作
(2)?LinkedList的鏈式線性表的缺點為:隨機訪問速度較慢。查找一個元素需要從頭開始一個一個的找
(3)是一種雙向循環(huán)鏈表的鏈式線性表,只不過存儲的結(jié)構(gòu)使用的是鏈式表而已
(4) LinkedList的內(nèi)部是基于雙向循環(huán)鏈表的結(jié)構(gòu)來實現(xiàn)的在LinkedList中有一個類似于c語言中結(jié)構(gòu)體的Entry內(nèi)部類
(5)在Entry的內(nèi)部類中包含了前一個元素的地址引用和后一個元素的地址引用類似于c語言中指針
三 .Set
Set中的元素實現(xiàn)了不重復(fù),有點象集合的概念,無序,不允許有重復(fù)的元素,最多允許有一個null元素對象
雖然Set中元素沒有順序,但是元素在set中的位置是有由該元素的HashCode決定的,其具體位置其實是固定的
Set中存儲的值,其實就是Map中的key,它們都是不允許重復(fù)的
對象A和對象B,本來是不同的兩個對象,正常情況下它們是能夠放入到Set里面的,但是
如果對象A和B的都重寫了hashcode和equals方法,并且重寫后的hashcode和equals方法是相同的話。那么A和B是不能同時放入到Set集合中去的,也就是Set集合中的去重和hashcode與equals方法直接相關(guān)
1.Hashset
(1)?底層數(shù)據(jù)結(jié)構(gòu)是哈希表
(2)? Hashset中允許出現(xiàn)一個null值
(3) ?由于HashSet底層是基于Hash算法實現(xiàn)的,使用了hashcode,所以HashSet中相應(yīng)的元素的位置是固定的
(4) 線程不安全
2 .LinkHashSet
(1)底層數(shù)據(jù)結(jié)構(gòu)是鏈表和哈希表,由鏈表保證元素有序,由哈希表保證元素唯一
?(2) 線程不安全
3.TreeSet
?(1) 線程不安全
?(2)底層數(shù)據(jù)結(jié)構(gòu)是紅黑樹。(唯一,有序)
?(3) 當向TreeSet中添加自定義的對象時,有兩種排序:自然排序? 定制排序
?(4)向TreeSet中添加元素時,首先按照compareTo()進行比較,一旦返回0,雖然僅是兩個對象的此屬性值相同,但是程序會認為這兩個對象是相同的,進而后一個對象就不能添加進來
四 .Map

1.HashMap
(1)? 允許key為null,也允許value為null
(2)? ?Hash表是一個數(shù)組+鏈表的結(jié)構(gòu)?這種結(jié)構(gòu)能夠保證在遍歷與增刪的過程中,如果不產(chǎn)生hash碰撞,僅需一次定??????位就可完成?但是如果散列表中的hash碰撞過多時當一個hash值上的鏈表長度大于8時,該節(jié)點上的數(shù)據(jù)就不再以鏈表進行??存儲,而是轉(zhuǎn)成了一個紅黑樹。
(3)? ?hash碰撞兩個元素通過hash函數(shù)計算出的值是一樣的,是同一個存儲地址當后面的元素要插入到這個地址時,發(fā)現(xiàn)已經(jīng)被占用了這時候就產(chǎn)生了hash沖突



(4)hashMap的put方法實現(xiàn)思路:
1.table[]是否為空
2.判斷table[i]處是否插入過值
3.判斷鏈表長度是否大于8,如果大于就轉(zhuǎn)換為紅黑二叉樹,并插入樹中
4.判斷key是否和原有key相同,如果相同就覆蓋原有key的value,并返回原有value
5.如果key不相同,就插入一個key,記錄結(jié)構(gòu)變化一次
(5)hashMap的get方法的實現(xiàn)思路:
1.判斷表或key是否是null,如果是直接返回null
2.判斷索引處第一個key與傳入key是否相等,如果相等直接返回
3.如果不相等,判斷鏈表是否是紅黑二叉樹,如果是,直接從樹中取值
4.如果不是樹,就遍歷鏈表查找

五 .集合的遍歷
1.list的遍歷


2.Map的遍歷



