欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java.util.Collection源碼分析與深度理解

 更新時(shí)間:2019年03月03日 15:08:26   作者:FOEVERYANG  
這篇文章主要給大家介紹了關(guān)于java.util.Collection的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

寫在開頭

java.util.Collection 作為Java開發(fā)最常用的接口之一,我們經(jīng)常使用,今天我?guī)Т蠹乙黄鹧芯恳幌翪ollection接口,希望對(duì)大家以后的編程以及系統(tǒng)設(shè)計(jì)能有所幫助,本文所研究的jdk版本為jdk1.8.0_131

明確一下幾點(diǎn):

  • Collection是接口,其繼承了Iterable接口
  • Collection屬于單值類型集合,重點(diǎn)子接口List接口和Set接口

    

Java.util.List接口(有序、不唯一)

   ArraryList

       

  ArrayList 是一個(gè)數(shù)組隊(duì)列,相當(dāng)于 動(dòng)態(tài)數(shù)組。與Java中的數(shù)組相比,它的容量能動(dòng)態(tài)增長(zhǎng)。它繼承于AbstractList,實(shí)現(xiàn)了List, RandomAccess, Cloneable, java.io.Serializable這些接口。ArrayList是非同步的,效率高但是線程不安全,Collections.sychromiziedList(new ArraryList<>());可以讓那個(gè)ArrayList變成線程安全類

  • ArrayList是基于動(dòng)態(tài)數(shù)組實(shí)現(xiàn)的,在增刪時(shí)候,需要數(shù)組的拷貝復(fù)制。
  • ArrayList的默認(rèn)初始化容量是10,每次擴(kuò)容時(shí)候增加原先容量的一半,也就是變?yōu)樵瓉?lái)的1.5倍
  • 刪除元素時(shí)不會(huì)減少容量,若希望減少容量則調(diào)用trimToSize()
  • 它不是線程安全的。它能存放null值。

   LinkedList

  

  LinkedList是一個(gè)雙向循環(huán)列表隊(duì)列

  • LinkedList 是一個(gè)繼承于AbstractSequentialList的雙向鏈表。它也可以被當(dāng)作堆棧、隊(duì)列或雙端隊(duì)列進(jìn)行操作。
  • LinkedList 實(shí)現(xiàn) List 接口,能對(duì)它進(jìn)行隊(duì)列操作。
  • LinkedList 實(shí)現(xiàn) Deque 接口,即能將LinkedList當(dāng)作雙端隊(duì)列使用。
  • LinkedList 實(shí)現(xiàn)了Cloneable接口,即覆蓋了函數(shù)clone() ,能克隆。
  • LinkedList 實(shí)現(xiàn)java.io.Serializable接口,這意味著LinkedList支持序列化,能通過(guò)序列化去傳輸。
  • LinkedList 是非同步的。

   Vector

底層是數(shù)組,現(xiàn)在已少用,被ArrayList替代,原因有兩個(gè):

  • Vector所有方法都是同步,有性能損失。
  • Vector初始length是10 超過(guò)length時(shí) 以100%比率增長(zhǎng),相比于ArrayList更多消耗內(nèi)存。
  • 參考資料:https://www.zhihu.com/question/31948523/answer/113357347

  總的來(lái)說(shuō):查詢多用ArrayList,增刪多用LinkedList。

  ArrayList增刪慢不是絕對(duì)的(在數(shù)量大的情況下,會(huì)有例外):

  • 如果增加元素一直是使用add() (增加到末尾)的話,并且不擴(kuò)容的情況下)
  • 一直刪除末尾的元素也是ArrayList要快【不用復(fù)制移動(dòng)位置】
  • 至于如果刪除的是中間的位置的話,還是ArrayList要快!

  但一般來(lái)說(shuō):增刪多還是用LinkedList,因?yàn)樯厦娴那闆r是極端的~

Java.util.Set接口(無(wú)序、唯一)

                                  |——SortedSet接口——TreeSet實(shí)現(xiàn)類

               Set接口——|——HashSet實(shí)現(xiàn)類               

                                   |——LinkedHashSet實(shí)現(xiàn)類

  hashSet

  hashSet底層基于hashMap實(shí)現(xiàn),如圖

  hashSet中的add()方法,是將對(duì)象E放入hashMap中的key的位置,value位置存放的是一個(gè)固定的Object,如圖:

  

HashSet是無(wú)序唯一的,當(dāng)元素為自定義對(duì)象時(shí),兩者的hashCode不同,被認(rèn)為是不同的元素從而被允許放入HashSet中,但這不符合實(shí)際的生產(chǎn)意義,因此需要讓其判定位相等,就要重寫hashCode() ,然而重寫HashCode() ,會(huì)出現(xiàn)重碼的bug,因此需要重寫equals()來(lái)解決

  添加元素的時(shí)候,如果key(也對(duì)應(yīng)的Set集合的元素)相等,那么則修改value值。而在Set集合中,value值僅僅是一個(gè)Object對(duì)象罷了(該對(duì)象對(duì)Set本身而言是無(wú)用的)。

也就是說(shuō):Set集合如果添加的元素相同時(shí),是根本沒(méi)有插入的(僅修改了一個(gè)無(wú)用的value值),從源碼(HashMap)中也看出來(lái),==和equals()方法都有使用,具體過(guò)程如下

  • 新元素的hsah是否等于老元素的hash,如果不相等,則元素不同,如果相等,那么進(jìn)行第二部比較
  • 新元素與老元素用“==”進(jìn)行比較,如果相等,則為同一元素,若不同則進(jìn)行第三部比較
  • 新元素和老元素用equals()方法判定是否相等,如果不等則不是同一元素,如果相等那么結(jié)果為:兩個(gè)元素不是同一個(gè)對(duì)象,程序想把它們當(dāng)成同一個(gè)對(duì)象,因此重寫了equals方法;

  TreeSet

   與HashSet是基于HashMap實(shí)現(xiàn)一樣,TreeSet同樣是基于TreeMap實(shí)現(xiàn)的。

TreeSet是SortedSet接口的唯一實(shí)現(xiàn)類,TreeSet可以確保集合元素處于排序狀態(tài)。TreeSet支持兩種排序方式,自然排序 和定制排序,其中自然排序?yàn)槟J(rèn)的排序方式。向  TreeSet中加入的應(yīng)該是同一個(gè)類的對(duì)象。

  LinkedHashSet 

   LinkedHashSet是HashSet的一個(gè)“擴(kuò)展版本”,HashSet并不管什么順序,不同的是LinkedHashSet會(huì)維護(hù)“插入順序”。HashSet內(nèi)部使用HashMap對(duì)象來(lái)存儲(chǔ)它的元素,而LinkedHashSet內(nèi)部使用LinkedHashMap對(duì)象來(lái)存儲(chǔ)和處理它的元素

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • Java集合Stream流操作的基本使用教程分享

    Java集合Stream流操作的基本使用教程分享

    流操作并不會(huì)影響原來(lái)的集合,可以簡(jiǎn)單認(rèn)為,流操作是把集合中的一個(gè)元素逐個(gè)復(fù)制放到一個(gè)首尾相接的流動(dòng)的水槽中。這篇文章整理了Stream流操作的基本使用,需要的可以參考一下
    2023-02-02
  • Java實(shí)現(xiàn)猜數(shù)字小游戲(有次數(shù)限制)

    Java實(shí)現(xiàn)猜數(shù)字小游戲(有次數(shù)限制)

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)猜數(shù)字小游戲,有次數(shù)限制,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • java8 streamList轉(zhuǎn)換使用詳解

    java8 streamList轉(zhuǎn)換使用詳解

    這篇文章主要介紹了java8 streamList轉(zhuǎn)換使用詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-08-08
  • springmvc模式的上傳和下載實(shí)現(xiàn)解析

    springmvc模式的上傳和下載實(shí)現(xiàn)解析

    這篇文章主要介紹了springmvc模式下的上傳和下載實(shí)現(xiàn)解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • MyBatisPlus 主鍵策略的實(shí)現(xiàn)(4種)

    MyBatisPlus 主鍵策略的實(shí)現(xiàn)(4種)

    MyBatis Plus 集成了多種主鍵策略,幫助用戶快速生成主鍵,本文主要介紹了MyBatisPlus主鍵策略的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-10-10
  • Java讀取String分行字符串的方法

    Java讀取String分行字符串的方法

    今天小編就為大家分享一篇Java讀取String分行字符串的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-07-07
  • Java多線程之并發(fā)編程的基石CAS機(jī)制詳解

    Java多線程之并發(fā)編程的基石CAS機(jī)制詳解

    這篇文章主要介紹了java并發(fā)編程之cas詳解,涉及cas使用場(chǎng)景和cas用作原子操作等內(nèi)容,具有一定參考價(jià)值,需要的朋友可以了解下
    2021-09-09
  • Spring框架基于注解的AOP之各種通知的使用與環(huán)繞通知實(shí)現(xiàn)詳解

    Spring框架基于注解的AOP之各種通知的使用與環(huán)繞通知實(shí)現(xiàn)詳解

    這篇文章主要介紹了Spring框架基于注解的AOP之各種通知的使用及其環(huán)繞通知,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧
    2022-11-11
  • Java實(shí)現(xiàn)查找文件和替換文件內(nèi)容

    Java實(shí)現(xiàn)查找文件和替換文件內(nèi)容

    這篇文章主要為大家詳細(xì)介紹了Java語(yǔ)言如何實(shí)現(xiàn)查找文件和替換文件內(nèi)容功能,文中的示例代碼講解詳細(xì),感興趣的可以跟隨小編一起學(xué)習(xí)一下
    2022-08-08
  • java list隨機(jī)抽取元素的案例

    java list隨機(jī)抽取元素的案例

    這篇文章主要介紹了java list隨機(jī)抽取元素的案例,具有很好的參考,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-08-08

最新評(píng)論