真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Java集合(CollectionListSetMap)-創(chuàng)新互聯(lián)

文章目錄
    • 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工具類

image-20221201231214042

我們擁有十余年網(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)演示

  1. add:添加單個(gè)元素
  2. remove:刪除指定元素
  3. contains:查找元素是否存在
  4. size:獲取元素個(gè)數(shù)
  5. isEmpty:判斷是否為空
  6. clear:清空
  7. addAll:添加多個(gè)元素
  8. containsAll:查找多個(gè)元素是否都存在
  9. removeAll:刪除多個(gè)元素
Collection接口遍歷元素方式1 -使用Iterator(迭代器)
  1. Iterator對(duì)象稱為迭代器,主要用于遍歷Collection集合中的元素。
  2. 所有實(shí)現(xiàn)了Collection接口的集合類都有一個(gè)iterator(方法, 用以返回一個(gè)實(shí)現(xiàn) 了Iterator接口的對(duì)象,即可以返回一個(gè)迭代器。
  3. Iterator的結(jié)構(gòu)
  4. Iterator僅用于遍歷集合,Iterator 本身并不存放對(duì)象。

image-20221202151134809

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接口的子接口

  1. List集合類中元素有序(即添加順序和取出順序一 致)、 且可重復(fù)
  2. List集合中的每個(gè)元素都有其對(duì)應(yīng)的順序索引,即支持索引。
  3. List容器中的元素都對(duì)應(yīng)一 個(gè)整數(shù)型的序號(hào)記載其在容器中的位置,可以根據(jù)序號(hào)存取容器中的元素

List集合里添加了一些根據(jù)索引來(lái)操作集合元素的方法

  1. void add(int index, Object ele):在index位置插入ele元素
  2. boolean addAll(int index, Collection eles):從index位置開始將eles中的所有元素添加進(jìn)來(lái)
  3. Object get(int index):獲取指定index位置的元素
  4. int indexOf(Object obj):返回obj在集合中首次出現(xiàn)的位置
  5. int lastIndexOf(Object obj):返回obj在當(dāng)前集合中末次出現(xiàn)的位置
  6. Object remove(int index):移除指定index位置的元素,并返回此元素
  7. Object set(int index, Object ele):設(shè)置指定index位置的元素為ele , 相當(dāng)于是替換
  8. List subList(int fromIndex, int tolndex): 返回從fromIndex到tolndex位置的子集合
List[ArrayList, LinkedList, Vector]的三種遍歷方式

方式一:使用iterator

方式二:使用增強(qiáng)for

方式三:使用普通for

ArrayList的注意事項(xiàng)
  1. permits all elements, includling null , ArrayList可以加入nulI,并且多個(gè)
  2. ArrayList是由數(shù)組來(lái)實(shí)現(xiàn)數(shù)據(jù)存儲(chǔ)的
  3. ArrayList基本等同于Vector ,除了ArrayList是線程不安全(執(zhí)行效率高)看源碼.
    在多線程情況下,不建議使用ArrayList
ArrayList的底層操作機(jī)制源碼分析
  1. ArrayList中維護(hù)了-個(gè)Object類型的數(shù)組elementData. [debug 看源碼]
    transient Object[] elementData;
  2. 當(dāng)創(chuàng)建對(duì)象時(shí),如果使用的是無(wú)參構(gòu)造器,則初始elementData容量為0 (jdk7是10)
  3. 當(dāng)添加元素時(shí):先判斷是否需要擴(kuò)容,如果需要擴(kuò)容,則調(diào)用grow方法,否則直接添加元素到合適位置
  4. 如果使用的是無(wú)參構(gòu)造器,如果第一次添加, 需要擴(kuò)容的話,則擴(kuò)容elementData為10,
    如果需要再次擴(kuò)容的話,則擴(kuò)容elementData為1.5倍。
  5. 如果使用的是指定容量capacity的構(gòu)造器,則初始elementData容量為capacity
  6. 如果使用的是指定容量capacity的構(gòu)造器,如果需要打容,則直接擴(kuò)容elementData為 1.5倍。
Vector和ArrayList的比較

image-20221202175147853

LinkedList底層結(jié)構(gòu)
  1. LinkedList底層實(shí)現(xiàn)了雙向鏈表和雙端隊(duì)列特點(diǎn)
  2. 可以添加任意元素(元素可以重復(fù)),包括null
  3. 線程不安全,沒(méi)有實(shí)現(xiàn)同步
LinkedList的底層操作機(jī)制
  1. LinkedList底層維護(hù)了一個(gè)雙向鏈表.
  2. LinkedList中維護(hù)了兩個(gè)屬性first和last分別指向首節(jié)點(diǎn)和尾節(jié)點(diǎn)
  3. 每個(gè)節(jié)點(diǎn)(Node對(duì)象) ,里面又維護(hù)了prev、next、 item三個(gè)屬性, 其中通過(guò)
    prev指向前一個(gè),通過(guò)next指向后一個(gè)節(jié)點(diǎn)。最終實(shí)現(xiàn)雙向鏈表
  4. 所以LinkedList的元素的添加和刪除,不是通過(guò)數(shù)組完成的,相對(duì)來(lái)說(shuō)效率較高。
  5. 模擬一個(gè)簡(jiǎn)單的雙向鏈表走代碼

image-20221202203528475

ArrayList和LinkedList的比較

這倆都是線程不安全的

image-20221202212347845

如何選擇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ō)明
  1. HashSet實(shí)現(xiàn)了Set接口
  2. HashSet實(shí)際上是HashMap,看下源碼.
  3. 可以存放null值,但是只能有一個(gè)null
  4. HashSet不保證元素是有序的,取決于hash后,再確定索引的結(jié)果.
  5. 不能有重復(fù)元素/對(duì)象.在前面Set接口使用已經(jīng)講過(guò)
HashSet底層機(jī)制說(shuō)明

分析HashSet的添加元素底層是如何實(shí)現(xiàn)(hash() + equals())

image-20221203114644214

  1. HashSet 底層是HashMap
  2. 添加一個(gè)元素時(shí),先得到hash值-會(huì)轉(zhuǎn)成->索引值
  3. 找到存儲(chǔ)數(shù)據(jù)表table ,看這個(gè)索引位置是否已經(jīng)存放的有元素
  4. 如果沒(méi)有,直接加入
  5. 如果有,調(diào)用equals比較,如果相同,就放棄添加,如果不相同,則添加到最后
  6. 在Java8中,如果條鏈表的元素個(gè)數(shù)超過(guò)TREEIFY THRESHOLD(默認(rèn)是8),并且table的大小 >=MIN_ TREEIFY CAPACITY(默認(rèn)64),就會(huì)進(jìn)行樹化(紅黑樹)
HashSet的擴(kuò)容和轉(zhuǎn)成紅黑樹機(jī)制
  1. 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如
  2. 如 果table數(shù)組使用到了臨界值12,就會(huì)擴(kuò)容到16* 2 = 32,新的臨界值就是32*0.75 = 24,依次類推
  3. 在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
  1. LinkedHashSet是HashSet的子類
  2. LinkedHashSet底層是一個(gè)LinkedHashMap,底層維護(hù)了一個(gè)數(shù)組+雙向鏈表
  3. LinkedHashSet根據(jù)元素的hashCode值來(lái)決定元素的存儲(chǔ)位置,同時(shí)使用鏈表維護(hù)元素的次序(圖),這使得元素看起來(lái)是以插入順序保存的。
  4. LinkedHashSet不允許添重復(fù)元素

image-20221203153346871

Map接口和常用方法

注意:這里講的是JDK8的Map接口特點(diǎn) Map_ java

  1. Map與Collection并列存在。用于保存具有映射關(guān)系的數(shù)據(jù):Key-Value
  2. Map中的key和value可以是任何引用類型的數(shù)據(jù),會(huì)封裝到HashMap$Node對(duì)象中
  3. Map中的key不允許重復(fù),原因和HashSet一樣,前面分析過(guò)源碼.
  4. Map中的value可以重復(fù)
  5. Map的key可以為null, value也可以為null,注意key為null,只能有一個(gè),value為null ,可以多個(gè).
  6. 常用String類作為Map的key
  7. key和value之間存在單向一對(duì)一關(guān)系,即通過(guò)指定的key總能找到對(duì)應(yīng)的value
  8. Map存放數(shù)據(jù)的key-value示意圖,-對(duì)k-v是放在一 個(gè)Node中的,有因?yàn)镹ode實(shí)現(xiàn)了Entry接口,有些書上也說(shuō)一對(duì)k-v就是一個(gè)Entry(如圖)

image-20221203164207865

常用方法
  1. put:添加
  2. remove:根據(jù)鍵刪除映射關(guān)系
  3. get:根據(jù)鍵獲取值
  4. size:獲取元素個(gè)數(shù)
  5. isEmpty:判斷個(gè)數(shù)是否為0
  6. clear:清除
  7. containsKey:查找鍵是否存在
Map遍歷方式

1)containsKey:查找鍵是否存在
2)keySet:獲取所有的鍵
3)entrySet:獲取所有關(guān)系k-v
4)values:獲取所有的值

image-20221203172045700

image-20221203172604821

image-20221203172806391

HashMap小結(jié)
  1. Map接口的常用實(shí)現(xiàn)類: HashMap、 HashTable和Properties。
  2. HashMap是Map接口使用頻率最高的實(shí)現(xiàn)類。
  3. HashMap是以key-val對(duì)的方式來(lái)存儲(chǔ)數(shù)據(jù)(HashMap$Node)
  4. key不能重復(fù),但是是值可以重復(fù),允許使用null鍵和null值。
  5. 如果添加相同的key,則會(huì)覆蓋原來(lái)的key-val ,等同于修改.(key不會(huì)替換,val會(huì)替換)
  6. 與HashSet一樣,不保證映射的順序,因?yàn)榈讓邮且詇ash表的方式來(lái)存儲(chǔ)的.
  7. HashMap沒(méi)有實(shí)現(xiàn)同步,因此是線程不安全的
HashMap底層機(jī)制
  1. HashMap底層維護(hù)了Node類型的數(shù)組table,默認(rèn)為null
  2. 當(dāng)創(chuàng)建對(duì)象時(shí),將加載因子(loadfactor)初始化為0.75.
  3. 當(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ò)容。
  4. 第1次添加,則需要擴(kuò)容table容量為16,臨界值(threshold)為12.
  5. 以后再擴(kuò)容,則需要擴(kuò)容table容量為原來(lái)的2倍,臨界值為原來(lái)的2倍,即24,依次類推
  6. 在Java8中,如果一條鏈表的元素個(gè)數(shù)超過(guò)TREEIFY THRESHOLD(默認(rèn)是8),并且table的大小>= MIN TREEIFY CAPACITY(默認(rèn)64),就會(huì)進(jìn)行樹化(紅黑樹)
Map接口實(shí)現(xiàn)類 -HashTable的基本介紹
  1. 存放的元素是鍵值對(duì):即K-V
  2. hashtable的鍵和值都不能為null,否則會(huì)拋出NullPointerException
  3. hashTable使用方法基本上和HashMap-樣
  4. hashTable是線程安全的,hashMap 是線程不安全的
  5. 簡(jiǎn)單看下底層結(jié)構(gòu)
Map接口實(shí)現(xiàn)類 - Properties基本介紹
  1. Properties類繼承自Hashtable類并且實(shí)現(xiàn)了Map接口, 也是使用一種鍵值對(duì)的形式來(lái)保存數(shù)據(jù)。
  2. 他的使用特點(diǎn)和Hashtable類似
  3. Properties 還可以用于從xxx.properties文件中,加載數(shù)據(jù)到Properties類對(duì)象,并進(jìn)行讀取和修改
  4. 說(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工具類
  1. Object max(Collection): 根據(jù)元素的自然順序,返回給定集合中的大元素
  2. Object max(Collection, Comparator): 根據(jù)Comparator指定的順序,返回給定集合中的大元素
  3. Object min(Collection)
  4. Object min(Collection, Comparator)
  5. int frequency(Collection, Object): 返回指定集合中指定元素的出現(xiàn)次數(shù)
  6. 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

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部