天天看點

[集合]Collection源碼解析(1)Collection源碼解析位址:

[集合]Collection源碼解析(1)

本篇進行介紹Collection接口,不會有很多,防止産生源碼恐懼症(别問我哪來的,我瞎編的)。

本篇不會直接上Collection接口的源碼,要看源碼的,可以移步至github,我專門建立了一個倉庫,友善管理後期的一些源碼解析和注釋。

Collection源碼解析位址:

https://github.com/chenhaoxiang/JDK1.8/blob/master/jdk-analyze/src/main/java/java/util/Collection.java

Collection接口是在JDK1.2之後有的,是Java中最基本的集合接口

一個Collection代表一組對象,即Collection中的元素(Elements)

Java SDK不會提供直接繼承自Collection的類,Java SDK提供的實作類都是繼承自Collection的“子接口”如List和Set。

(Collection接口注釋中有說明)

Collection接口是高度抽象出來的集合,它包含了集合的基本操作:

查詢操作、修改操作、批量操作,另外還提供了比較和散列操作(equals和hashCode);

涵蓋了添加、删除、清空、周遊(讀取)、是否為空、擷取集合大小、批量處理等等操作。滿足通用集合的所有要求了,如果有其他需求,可以自己進行擴充。另外JDK也提供了很多該接口的子接口的實作,基于該接口進行了非常多的擴充,後面文章也會一一道來。

在JDK1.8,該接口新增了四個有預設實作的方法:

  • default boolean removeIf(Predicate<? super E> filter)
  • default Spliterator spliterator()
  • default Stream stream()
  • default Stream parallelStream()

    這四個方法能夠在接口上進行預設的實作,得益于Java 8使用兩個新概念擴充了接口的含義,即預設方法和靜态方法。

預設方法使得開發者可以在 不破壞二進制相容性的前提下,往現存接口中添加新的方法,即不強制那些實作了該接口的類也同時實作這個新加的方法。

預設方法和抽象方法之間的差別在于抽象方法需要實作,而預設方法不需要。接口提供的預設方法會被接口的實作類繼承或者覆寫

由于JVM上的預設方法的實作在位元組碼層面提供了支援,是以效率非常高。預設方法允許在不打破現有繼承體系的基礎上改進接口。

盡管預設方法有這麼多好處,但在實際開發中應該謹慎使用:在複雜的繼承體系中,預設方法可能引起歧義和編譯錯誤。如果你想了解更多細節,可以參考官方文檔的說明:

https://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html

這四個接口暫時不會進行講解,這是JDK8的新特性。後續如果講到了Spliterator接口再進行補充這幾個方法

其實接口的源碼沒啥好說的,就是定義了一些接口,無論是JDK自己擴充,還是開發者自行擴充,那都是實作的事了。是以本篇就到這裡,要了解Collection接口的方法有哪些,請看Collection源碼解析位址:

不過可以道一下Collection接口的繼承關系,比較它的常用子類後面都會通過文章一一講解。

繼承Collection接口,非常重要的接口有兩個,List和Set。

List是有序的隊列,可以有重複的元素;而Set是數學概念中的集合,不能有重複的元素。List和Set都有它們各自的實作類。

為了友善,JDK又抽象出AbstractCollection類來讓其他類來進行繼承,該類實作了接口Collection中的絕大部分方法。

AbstractList和AbstractSet都繼承與AbstractCollection,具體的List實作類繼承與AbstractList,而Set的實作類則繼承與AbstractSet。

圖的話,我就不畫了,想偷懶~!~ 大家腦海中想象一下結構就好。後面也還會說到這些結構。

為啥會有Collection這個接口,這個應該就和接口的作用有點關系了。簡單的描述下就是:接口将使用接口的人和實作接口的人分開。也就是說,實作接口的人不用管誰使用接口,而使用接口的人也不需要管誰進行實作,使用接口即可。

和IoC思想某個方面還是有點像的。解耦解耦還是解耦。圈起來,要考的。

關于集合的源碼講解,開頭就是到這裡了,後面更加精彩

記得去看Collection源碼解析位址噢:

不介意的話,可以來個star,後續會持續更新

忘記說了,Collection繼承了Iterator接口,Iterator接口是JDK1.5之後才有的,後面再徐徐道來

(源碼解析基于JDK1.8版本)

原文位址:

https://copyfuture.com/blogs-details/20190910135225856szh6cv83a7xawks

下集預告:

不出意外的話,是AbstractCollection類的解析

插播廣告:

未關注的貝貝可以來波關注啦。後續更多精彩内容等着您。

吾非大神,與汝俱進