文章目錄
- Collection接口和常用方法
- Collection接口遍歷元素方式1 -使用Iterator(迭代器)
- Collection接口遍歷對(duì)象方式2-for循環(huán)增強(qiáng)
- List接口和常用方法
- List[ArrayList, LinkedList, Vector]的三種遍歷方式
- ArrayList的注意事項(xiàng)
- ArrayList的底層操作機(jī)制源碼分析
- Vector和ArrayList的比較
- LinkedList底層結(jié)構(gòu)
- LinkedList的底層操作機(jī)制
- ArrayList和LinkedList的比較
- Set接口和常用方法
- HashSet的全面說(shuō)明
- HashSet底層機(jī)制說(shuō)明
- HashSet的擴(kuò)容和轉(zhuǎn)成紅黑樹機(jī)制
- Set接口實(shí)現(xiàn)類 - LinkedHashSet
- Map接口和常用方法
- 常用方法
- Map遍歷方式
- HashMap小結(jié)
- HashMap底層機(jī)制
- Map接口實(shí)現(xiàn)類 -HashTable的基本介紹
- Map接口實(shí)現(xiàn)類 - Properties基本介紹
- 總結(jié)-開發(fā)中如何選擇集合實(shí)現(xiàn)類
- Collections工具類
我們擁有十余年網(wǎng)頁(yè)設(shè)計(jì)和網(wǎng)站建設(shè)經(jīng)驗(yàn),從網(wǎng)站策劃到網(wǎng)站制作,我們的網(wǎng)頁(yè)設(shè)計(jì)師為您提供的解決方案。為企業(yè)提供
網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì)、微信開發(fā)、
微信平臺(tái)小程序開發(fā)、
成都手機(jī)網(wǎng)站制作、
H5建站、等業(yè)務(wù)。無(wú)論您有什么樣的網(wǎng)站設(shè)計(jì)或者設(shè)計(jì)方案要求,我們都將富于創(chuàng)造性的提供專業(yè)設(shè)計(jì)服務(wù)并滿足您的需求。
集合的理解和好處
前面我們保存多個(gè)數(shù)據(jù)使用的是數(shù)組,那么數(shù)組有不足的地方,我們分析一下。
1)長(zhǎng)度開始時(shí)必須指定,而且一旦指定,不能更改
2)保存的必須為同一類型的元素
3)使用數(shù)組進(jìn)行增加元素的示意代碼-比較麻煩
那么集合有哪些好處呢?
1)可以動(dòng)態(tài)保存任意多個(gè)對(duì)象,使用比較方便!
2)提供了一系列方便的操作對(duì)象的方法: add、 remove、 set、 get等
3)使用集合添加, 刪除新元素的示意代碼-簡(jiǎn)潔了
?
Collection接口和常用方法
public interface Collectionextends Iterable
1)collection實(shí)現(xiàn)子類可以存放多個(gè)元素,每個(gè)元素可以是Object
2)有些Collection的實(shí)現(xiàn)類,可以存放重復(fù)的元素,有些不可以
3)有些Collection的實(shí)現(xiàn)類,有些是有序的(List),有些不是有序(Set)
4)Collection接口沒(méi)有直接的實(shí)現(xiàn)子類,是通過(guò)它的子接口Set和List來(lái)實(shí)現(xiàn)的
Collection接口常用方法,以實(shí)現(xiàn)子類ArrayList來(lái)演示
- add:添加單個(gè)元素
- remove:刪除指定元素
- contains:查找元素是否存在
- size:獲取元素個(gè)數(shù)
- isEmpty:判斷是否為空
- clear:清空
- addAll:添加多個(gè)元素
- containsAll:查找多個(gè)元素是否都存在
- removeAll:刪除多個(gè)元素
Collection接口遍歷元素方式1 -使用Iterator(迭代器)
- Iterator對(duì)象稱為迭代器,主要用于遍歷Collection集合中的元素。
- 所有實(shí)現(xiàn)了Collection接口的集合類都有一個(gè)iterator(方法, 用以返回一個(gè)實(shí)現(xiàn) 了Iterator接口的對(duì)象,即可以返回一個(gè)迭代器。
- Iterator的結(jié)構(gòu)
- Iterator僅用于遍歷集合,Iterator 本身并不存放對(duì)象。
import java.util.ArrayList;
import java.util.Iterator;
public class Collection01 {public static void main(String[] args) {ArrayList al = new ArrayList();
al.add("AA");
al.add(11);
al.add("三國(guó)演義");
Iterator iterator = al.iterator();
while (iterator.hasNext()) {Object obj = iterator.next();
System.out.println(obj);
}
}
}
Collection接口遍歷對(duì)象方式2-for循環(huán)增強(qiáng)
增強(qiáng)for循環(huán),可以代替iterator迭代器, 特點(diǎn): 增強(qiáng)for就是簡(jiǎn)化版的iterator, 本質(zhì)一樣。只能用于遍歷集合或數(shù)組。
基本語(yǔ)法
for(元素類型 元素名:集合名或數(shù)組名) {訪問(wèn)元素
}
List接口和常用方法
List接口是Collection接口的子接口
- List集合類中元素有序(即添加順序和取出順序一 致)、 且可重復(fù)
- List集合中的每個(gè)元素都有其對(duì)應(yīng)的順序索引,即支持索引。
- List容器中的元素都對(duì)應(yīng)一 個(gè)整數(shù)型的序號(hào)記載其在容器中的位置,可以根據(jù)序號(hào)存取容器中的元素
List集合里添加了一些根據(jù)索引來(lái)操作集合元素的方法
- void add(int index, Object ele):在index位置插入ele元素
- boolean addAll(int index, Collection eles):從index位置開始將eles中的所有元素添加進(jìn)來(lái)
- Object get(int index):獲取指定index位置的元素
- int indexOf(Object obj):返回obj在集合中首次出現(xiàn)的位置
- int lastIndexOf(Object obj):返回obj在當(dāng)前集合中末次出現(xiàn)的位置
- Object remove(int index):移除指定index位置的元素,并返回此元素
- Object set(int index, Object ele):設(shè)置指定index位置的元素為ele , 相當(dāng)于是替換
- List subList(int fromIndex, int tolndex): 返回從fromIndex到tolndex位置的子集合
List[ArrayList, LinkedList, Vector]的三種遍歷方式
方式一:使用iterator
方式二:使用增強(qiáng)for
方式三:使用普通for
ArrayList的注意事項(xiàng)
- permits all elements, includling null , ArrayList可以加入nulI,并且多個(gè)
- ArrayList是由數(shù)組來(lái)實(shí)現(xiàn)數(shù)據(jù)存儲(chǔ)的
- ArrayList基本等同于Vector ,除了ArrayList是線程不安全(執(zhí)行效率高)看源碼.
在多線程情況下,不建議使用ArrayList
ArrayList的底層操作機(jī)制源碼分析
- ArrayList中維護(hù)了-個(gè)Object類型的數(shù)組elementData. [debug 看源碼]
transient Object[] elementData; - 當(dāng)創(chuàng)建對(duì)象時(shí),如果使用的是無(wú)參構(gòu)造器,則初始elementData容量為0 (jdk7是10)
- 當(dāng)添加元素時(shí):先判斷是否需要擴(kuò)容,如果需要擴(kuò)容,則調(diào)用grow方法,否則直接添加元素到合適位置
- 如果使用的是無(wú)參構(gòu)造器,如果第一次添加, 需要擴(kuò)容的話,則擴(kuò)容elementData為10,
如果需要再次擴(kuò)容的話,則擴(kuò)容elementData為1.5倍。 - 如果使用的是指定容量capacity的構(gòu)造器,則初始elementData容量為capacity
- 如果使用的是指定容量capacity的構(gòu)造器,如果需要打容,則直接擴(kuò)容elementData為 1.5倍。
Vector和ArrayList的比較
LinkedList底層結(jié)構(gòu)
- LinkedList底層實(shí)現(xiàn)了雙向鏈表和雙端隊(duì)列特點(diǎn)
- 可以添加任意元素(元素可以重復(fù)),包括null
- 線程不安全,沒(méi)有實(shí)現(xiàn)同步
LinkedList的底層操作機(jī)制
- LinkedList底層維護(hù)了一個(gè)雙向鏈表.
- LinkedList中維護(hù)了兩個(gè)屬性first和last分別指向首節(jié)點(diǎn)和尾節(jié)點(diǎn)
- 每個(gè)節(jié)點(diǎn)(Node對(duì)象) ,里面又維護(hù)了prev、next、 item三個(gè)屬性, 其中通過(guò)
prev指向前一個(gè),通過(guò)next指向后一個(gè)節(jié)點(diǎn)。最終實(shí)現(xiàn)雙向鏈表 - 所以LinkedList的元素的添加和刪除,不是通過(guò)數(shù)組完成的,相對(duì)來(lái)說(shuō)效率較高。
- 模擬一個(gè)簡(jiǎn)單的雙向鏈表走代碼
ArrayList和LinkedList的比較
這倆都是線程不安全的
如何選擇ArrayList和LinkedList:
1)如果我們改查的操作多,選擇ArrayList
2)如果我們?cè)鰟h的操作多,選擇LinkedList
3)一般來(lái)說(shuō),在程序中,80%-90%都是查詢,因此大部分情況下會(huì)選擇ArrayList
4)在一個(gè)項(xiàng)目中,根據(jù)業(yè)務(wù)靈活選擇,也可能這樣,一個(gè)模塊使用的是ArrayList,另外一個(gè)模塊是LinkedList.
Set接口和常用方法
1 無(wú)序(添加和取出的順序不一致),沒(méi)有索引
2 不允許重復(fù)元素,所以最多包含一個(gè)null
3 JDK APl中Set接口的實(shí)現(xiàn)類有: AbstractSet, ConcurrentSkipListSet, CopyOnWriteArraySet, EnumSet, HashSet, JobStateReasons, LinkedHashSet, TreeSet
和List接口一樣,Set接口也是Collection的子接口,因此,常用方法和Collection接口一樣.
同Collection的遍歷方式一樣,因?yàn)镾et接口是Collection接口的子接口。
1.可以使用迭代器
2.增強(qiáng)for
3.不能使用索引的方式來(lái)獲取元素.
HashSet的全面說(shuō)明
- HashSet實(shí)現(xiàn)了Set接口
- HashSet實(shí)際上是HashMap,看下源碼.
- 可以存放null值,但是只能有一個(gè)null
- HashSet不保證元素是有序的,取決于hash后,再確定索引的結(jié)果.
- 不能有重復(fù)元素/對(duì)象.在前面Set接口使用已經(jīng)講過(guò)
HashSet底層機(jī)制說(shuō)明
分析HashSet的添加元素底層是如何實(shí)現(xiàn)(hash() + equals())
- HashSet 底層是HashMap
- 添加一個(gè)元素時(shí),先得到hash值-會(huì)轉(zhuǎn)成->索引值
- 找到存儲(chǔ)數(shù)據(jù)表table ,看這個(gè)索引位置是否已經(jīng)存放的有元素
- 如果沒(méi)有,直接加入
- 如果有,調(diào)用equals比較,如果相同,就放棄添加,如果不相同,則添加到最后
- 在Java8中,如果條鏈表的元素個(gè)數(shù)超過(guò)TREEIFY THRESHOLD(默認(rèn)是8),并且table的大小 >=MIN_ TREEIFY CAPACITY(默認(rèn)64),就會(huì)進(jìn)行樹化(紅黑樹)
HashSet的擴(kuò)容和轉(zhuǎn)成紅黑樹機(jī)制
- HashSet底層是HashMap,第一次添加時(shí),table 數(shù)組擴(kuò)容到16,臨界值(threshold)是
16
?
加
載
因
子
(
l
o
a
d
F
a
c
t
o
r
)
是
0.75
=
12
16*加載因子(loadFactor)是0.75 = 12
16?加載因子(loadFactor)是0.75=12如
- 如 果table數(shù)組使用到了臨界值12,就會(huì)擴(kuò)容到16* 2 = 32,新的臨界值就是32*0.75 = 24,依次類推
- 在Java8中,如果一條鏈表的元素個(gè)數(shù)到達(dá)TREEIFY THRESHOLD(默認(rèn)是8 ),并且table的大小>=MIN TREEIFY CAPACITY(默認(rèn)64),就會(huì)進(jìn)行樹化(紅黑樹),否則仍然采用數(shù)組擴(kuò)容機(jī)制
Set接口實(shí)現(xiàn)類 - LinkedHashSet
- LinkedHashSet是HashSet的子類
- LinkedHashSet底層是一個(gè)LinkedHashMap,底層維護(hù)了一個(gè)數(shù)組+雙向鏈表
- LinkedHashSet根據(jù)元素的hashCode值來(lái)決定元素的存儲(chǔ)位置,同時(shí)使用鏈表維護(hù)元素的次序(圖),這使得元素看起來(lái)是以插入順序保存的。
- LinkedHashSet不允許添重復(fù)元素
Map接口和常用方法
注意:這里講的是JDK8的Map接口特點(diǎn) Map_ java
- Map與Collection并列存在。用于保存具有映射關(guān)系的數(shù)據(jù):Key-Value
- Map中的key和value可以是任何引用類型的數(shù)據(jù),會(huì)封裝到HashMap$Node對(duì)象中
- Map中的key不允許重復(fù),原因和HashSet一樣,前面分析過(guò)源碼.
- Map中的value可以重復(fù)
- Map的key可以為null, value也可以為null,注意key為null,只能有一個(gè),value為null ,可以多個(gè).
- 常用String類作為Map的key
- key和value之間存在單向一對(duì)一關(guān)系,即通過(guò)指定的key總能找到對(duì)應(yīng)的value
- Map存放數(shù)據(jù)的key-value示意圖,-對(duì)k-v是放在一 個(gè)Node中的,有因?yàn)镹ode實(shí)現(xiàn)了Entry接口,有些書上也說(shuō)一對(duì)k-v就是一個(gè)Entry(如圖)
常用方法
- put:添加
- remove:根據(jù)鍵刪除映射關(guān)系
- get:根據(jù)鍵獲取值
- size:獲取元素個(gè)數(shù)
- isEmpty:判斷個(gè)數(shù)是否為0
- clear:清除
- containsKey:查找鍵是否存在
Map遍歷方式
1)containsKey:查找鍵是否存在
2)keySet:獲取所有的鍵
3)entrySet:獲取所有關(guān)系k-v
4)values:獲取所有的值
HashMap小結(jié)
- Map接口的常用實(shí)現(xiàn)類: HashMap、 HashTable和Properties。
- HashMap是Map接口使用頻率最高的實(shí)現(xiàn)類。
- HashMap是以key-val對(duì)的方式來(lái)存儲(chǔ)數(shù)據(jù)(HashMap$Node)
- key不能重復(fù),但是是值可以重復(fù),允許使用null鍵和null值。
- 如果添加相同的key,則會(huì)覆蓋原來(lái)的key-val ,等同于修改.(key不會(huì)替換,val會(huì)替換)
- 與HashSet一樣,不保證映射的順序,因?yàn)榈讓邮且詇ash表的方式來(lái)存儲(chǔ)的.
- HashMap沒(méi)有實(shí)現(xiàn)同步,因此是線程不安全的
HashMap底層機(jī)制
- HashMap底層維護(hù)了Node類型的數(shù)組table,默認(rèn)為null
- 當(dāng)創(chuàng)建對(duì)象時(shí),將加載因子(loadfactor)初始化為0.75.
- 當(dāng)添加key-val時(shí),通過(guò)key的哈希值得到在table的索引。然后判斷該索引處是否有元素,如果沒(méi)有元素直接添加。如果該索引處有元素,繼續(xù)判斷該元素的key是否和準(zhǔn)備加入的key相等,如果相等,則直接替換val;如果不相等需要判斷是樹結(jié)構(gòu)還是鏈表結(jié)構(gòu),做出相應(yīng)處理。如果添加時(shí)發(fā)現(xiàn)容量不夠,則需要擴(kuò)容。
- 第1次添加,則需要擴(kuò)容table容量為16,臨界值(threshold)為12.
- 以后再擴(kuò)容,則需要擴(kuò)容table容量為原來(lái)的2倍,臨界值為原來(lái)的2倍,即24,依次類推
- 在Java8中,如果一條鏈表的元素個(gè)數(shù)超過(guò)TREEIFY THRESHOLD(默認(rèn)是8),并且table的大小>= MIN TREEIFY CAPACITY(默認(rèn)64),就會(huì)進(jìn)行樹化(紅黑樹)
Map接口實(shí)現(xiàn)類 -HashTable的基本介紹
- 存放的元素是鍵值對(duì):即K-V
- hashtable的鍵和值都不能為null,否則會(huì)拋出NullPointerException
- hashTable使用方法基本上和HashMap-樣
- hashTable是線程安全的,hashMap 是線程不安全的
- 簡(jiǎn)單看下底層結(jié)構(gòu)
Map接口實(shí)現(xiàn)類 - Properties基本介紹
- Properties類繼承自Hashtable類并且實(shí)現(xiàn)了Map接口, 也是使用一種鍵值對(duì)的形式來(lái)保存數(shù)據(jù)。
- 他的使用特點(diǎn)和Hashtable類似
- Properties 還可以用于從xxx.properties文件中,加載數(shù)據(jù)到Properties類對(duì)象,并進(jìn)行讀取和修改
- 說(shuō)明: 工作后xx.properties 文件通常作為配置文件,這個(gè)知識(shí)點(diǎn)在I0流舉例,有興趣可先看文章
總結(jié)-開發(fā)中如何選擇集合實(shí)現(xiàn)類
1)先判斷存儲(chǔ)的類型(一組對(duì)象[單列]或一組鍵值對(duì)[雙列])
2)一組對(duì)象[單列]: Collection接口
允許重復(fù): List
增刪多: LinkedList [底層維護(hù)了一個(gè)雙向鏈表]
改查多: ArrayList [底層維護(hù)Object類型的可變數(shù)組]
不允許重復(fù): Set
無(wú)序: HashSet [底層是HashMap ,維護(hù)了一個(gè)哈希表即(數(shù)組+鏈表紅黑樹)]
排序: TreeSet
插入和取出順序一致: LinkedHashSet , 維護(hù)數(shù)組+雙向鏈表
3)一組鍵值對(duì):Map
鍵無(wú)序: HashMap [底層是:哈希表jdk7: 數(shù)組+鏈表,jdk8:數(shù)組+鏈表+紅黑樹]
鍵排序: TreeMap
鍵插入和取出順序一致: LinkedHashMap
讀取文件Properties
Collections工具類
- Object max(Collection): 根據(jù)元素的自然順序,返回給定集合中的大元素
- Object max(Collection, Comparator): 根據(jù)Comparator指定的順序,返回給定集合中的大元素
- Object min(Collection)
- Object min(Collection, Comparator)
- int frequency(Collection, Object): 返回指定集合中指定元素的出現(xiàn)次數(shù)
- void copy(List dest,List src):將src中的內(nèi)容復(fù)制到dest中
ections工具類
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧
當(dāng)前題目:Java集合(CollectionListSetMap)-創(chuàng)新互聯(lián)
當(dāng)前URL:
http://weahome.cn/article/dpdeos.html