激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|JavaScript|易語言|

服務器之家 - 編程語言 - Java教程 - java.util.Collection源碼分析與深度理解

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

2021-07-18 15:34FOEVERYANG Java教程

這篇文章主要給大家介紹了關于java.util.Collection的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧

寫在開頭

java.util.collection 作為java開發最常用的接口之一,我們經常使用,今天我帶大家一起研究一下collection接口,希望對大家以后的編程以及系統設計能有所幫助,本文所研究的jdk版本為jdk1.8.0_131

明確一下幾點:

  • collection是接口,其繼承了iterable接口
  • collection屬于單值類型集合,重點子接口list接口和set接口

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

java.util.list接口(有序、不唯一)

   arrarylist

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

  arraylist 是一個數組隊列,相當于 動態數組。與java中的數組相比,它的容量能動態增長。它繼承于abstractlist,實現了list, randomaccess, cloneable, java.io.serializable這些接口。arraylist是非同步的,效率高但是線程不安全,collections.sychromiziedlist(new arrarylist<>());可以讓那個arraylist變成線程安全類

  • arraylist是基于動態數組實現的,在增刪時候,需要數組的拷貝復制。
  • arraylist的默認初始化容量是10,每次擴容時候增加原先容量的一半,也就是變為原來的1.5倍
  • 刪除元素時不會減少容量,若希望減少容量則調用trimtosize()
  • 它不是線程安全的。它能存放null值。

   linkedlist

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

  linkedlist是一個雙向循環列表隊列

  • linkedlist 是一個繼承于abstractsequentiallist的雙向鏈表。它也可以被當作堆棧、隊列或雙端隊列進行操作。
  • linkedlist 實現 list 接口,能對它進行隊列操作。
  • linkedlist 實現 deque 接口,即能將linkedlist當作雙端隊列使用。
  • linkedlist 實現了cloneable接口,即覆蓋了函數clone() ,能克隆。
  • linkedlist 實現java.io.serializable接口,這意味著linkedlist支持序列化,能通過序列化去傳輸。
  • linkedlist 是非同步的。

   vector

底層是數組,現在已少用,被arraylist替代,原因有兩個:

  • vector所有方法都是同步,有性能損失。
  • vector初始length是10 超過length時 以100%比率增長,相比于arraylist更多消耗內存。
  • 參考資料:https://www.zhihu.com/question/31948523/answer/113357347

  總的來說:查詢多用arraylist,增刪多用linkedlist。

  arraylist增刪慢不是絕對的(在數量大的情況下,會有例外):

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

  但一般來說:增刪多還是用linkedlist,因為上面的情況是極端的~

java.util.set接口(無序、唯一)

                                  |——sortedset接口——treeset實現類

               set接口——|——hashset實現類               

                                   |——linkedhashset實現類

  hashset

  hashset底層基于hashmap實現,如圖

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

  hashset中的add()方法,是將對象e放入hashmap中的key的位置,value位置存放的是一個固定的object,如圖:

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

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

hashset是無序唯一的,當元素為自定義對象時,兩者的hashcode不同,被認為是不同的元素從而被允許放入hashset中,但這不符合實際的生產意義,因此需要讓其判定位相等,就要重寫hashcode() ,然而重寫hashcode() ,會出現重碼的bug,因此需要重寫equals()來解決

  添加元素的時候,如果key(也對應的set集合的元素)相等,那么則修改value值。而在set集合中,value值僅僅是一個object對象罷了(該對象對set本身而言是無用的)。

也就是說:set集合如果添加的元素相同時,是根本沒有插入的(僅修改了一個無用的value值),從源碼(hashmap)中也看出來,==和equals()方法都有使用,具體過程如下

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

  treeset

   與hashset是基于hashmap實現一樣,treeset同樣是基于treemap實現的。

treeset是sortedset接口的唯一實現類,treeset可以確保集合元素處于排序狀態。treeset支持兩種排序方式,自然排序 和定制排序,其中自然排序為默認的排序方式。向  treeset中加入的應該是同一個類的對象。

  linkedhashset 

   linkedhashset是hashset的一個“擴展版本”,hashset并不管什么順序,不同的是linkedhashset會維護“插入順序”。hashset內部使用hashmap對象來存儲它的元素,而linkedhashset內部使用linkedhashmap對象來存儲和處理它的元素

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對服務器之家的支持。

原文鏈接:https://www.cnblogs.com/lsgspace/p/10464757.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 91福利在线观看 | 久久久一区二区三区四区 | 视频一区二区三区在线观看 | 亚洲电影免费观看国语版 | 91看片在线观看视频 | 久久久鲁| 色视频在线观看 | 黄色网络免费看 | 中国国语毛片免费观看视频 | 欧美人xx | 色av综合在线 | 北京一级毛片 | 91精品国产手机 | 久久精品一二三区白丝高潮 | 亚洲国产精品一区二区久久 | 国产精品久久久久久影院8一贰佰 | 日本aaaa片毛片免费观看视频 | 国产精品久久国产精品 | 97色在线观看免费视频 | 久综合 | 欧美黄色一级片在线观看 | 黄色片在线免费播放 | 91短视频网页版 | 国产精品视频在 | 91极品视频在线观看 | 精品国产一区二区三区在线观看 | 一级毛片免费观看在线 | 视频一区二区三区在线播放 | 91懂色| 久久精品美乳 | 成人毛片一区二区三区 | 日韩视频观看 | 天天操天天操天天操天天操天天操天天操 | 久久久久99精品 | av在线在线 | 欧美一区二区三区免费观看 | 精品亚洲一区二区 | 国内精品视频饥渴少妇在线播放 | 久久91久久久久麻豆精品 | 免费看成人毛片 | 日韩精品中文字幕一区二区三区 |