java源碼學習之集合系列一(java集合源碼解析)

本文目錄一覽:

學習Java中的集合類有沒有什麼書專門講這個的

每一本Java入門的書籍,都會用專門的章節講集合類的,不過因為JDK5對集合有較大的更新,推薦看JDK5發布以後推出或更新的書籍。

如Core Java 第八版。

為什麼學習集合關係

集合可以說是學習 Java 中最重要的一塊知識點了,無論做任何業務系統,集合總是最為基礎的那塊 API。我第一次接觸集合,是在我大三的時候,那時候去面試,面試官問我:你了解過集合嗎?可惜那時候沒什麼項目經驗,所以基本沒有了解過,因此也錯失了機會。

到了現在,我已經工作了5年了,也做過了大大小小十幾個項目。這些項目中有簡單的 SSH 項目,也有分布式高並發的複雜項目。無論在哪個項目中,關於集合的時候是必不可少的。但我現在慢慢回顧過去做的項目,我發現自己使用到的集合還是比較少,基本上只有:ArrayList、HashSet、HashMap 這幾個。

但當我開始深入去了解 JDK 集合的整個體系時,我發現之前的我了解得確實非常淺顯。例如關於 List 的實現有 ArrayList、LinkedList、Vector、Stack 這四種實現,但我們很多時候只是直接使用 ArrayList,而不是根據場景去選擇。

1.學習集合源碼,能夠讓我們使用得更加準確。

當我們深入學習了源碼之後,我們就能夠了解其特性,從而能夠根據我們的使用場景去做出更好的選擇,從而讓我們的代碼運行效率更高。

我們舉一個最簡單的例子 —— ArrayList 和 LinkedList。它們兩者底層採用了完全不同的實現方式,ArrayList 使用數組實現,而 LinkedList 則使用鏈表實現。這使得 ArrayList 的讀取效率高,而 LinkedList 的讀取效率低。但因為 LinkedList 採用鏈表實現,所以其增加和刪除比較方便,而 ArrayList 則比較麻煩。所以 ArrayList 比較適合用於讀場合較多的情況,而 LinkedList 比較適合用於增加、刪除較多的場景。

我們來看另外一個例子 —— HashMap 和 TreeMap。乍看之下,他們都是 Map 集合的實現,但是它們內部有着截然不同的實現。HashMap 是 Map 接口的哈希實現,其內部使用了鏈表和紅黑樹實現。而 TreeMap 是 Map 接口的有序實現,其內部使用了紅黑樹實現。所以 HashMap 一般用來存儲 key、value 的實現,而 TreeMap 常用存儲需要排序的元素。

除了我們舉的這兩個例子之外,還有許多這樣的例子,比如:HashMap 與 LinkedHashMap 的區別,HashMap 與 WeakHashMap 的區別,LinkedList 與 ArrayDeque 的區別。

2.學習集合源碼,讓我們學習經典的設計方式。

在集合的整個架構設計中,其類繼承體系非常簡單,但是卻很經典。例如:Collection 接口設計了集合通用的操作,每個集合類型都有對應的接口(List、Set、Map),每個集合類型都有對應的抽象實現(AbstractList、AbstractSet、AbstractMap)等。

當我們閱讀這些源碼的時候,這種設計方式都會潛移默化地影響我們。當我們之後自己設計一個框架的時候,我們就會不知不覺地用上去。所有的創新都是從模仿開始的,所以閱讀優秀的集合源碼很重要。

3.幫助通過面試,獲得更高的薪酬。

現在關於集合的原理是 Java 工程師面試的家常菜,幾乎每一個企業的面試都會問到。如果你連這塊東西都沒搞清楚,那麼你就不需要聊其他了,直接被幹掉。而如果你能將整個 Java 集合體系清晰地說出去,並且舉一反三地對比,那麼你就比其他人優秀了。

4.學習經典的數據結構。

還記得大學在學習數據結構的時候,我們都是從理論上去記憶。但是當我看完集合源碼之後,我忽然發現——JDK集合源碼簡直就是數據結構的最佳實踐呀!

數據結構中最為基礎的幾個結構為:順序表、單鏈表、雙向鏈表、隊列、棧、二叉堆、紅黑樹、哈希表。這些所有的實現都能在 JDK 集合的實現中找到。例如:ArrayList 就是順序表的實現,LinkedList 就是雙向鏈表的實現,Stack 就是棧的實現,HashMap 就是哈希表的實現,TreeMap 就是紅黑樹的實現,PriorityQueue 就是二叉堆的實現。

5.所有技術的基礎

集合源碼可以說是 JDK 所有源碼中最為簡單的一塊了,而且也是其他所有源碼的基礎。例如線程池的源碼中也大量使用了阻塞隊列,如果你連集合源碼都搞不懂,那麼線程池的源碼你也肯定看不懂的。而如果線程池源碼看不懂,那麼你 netty 的源碼也看不懂的。netty 源碼看不懂,那麼 dubbo 的源碼也是看不懂的。

看明白了么?這些技術都是一換扣着一換的。如果你想要後續學習更加快速,那麼你就必須把最基礎的東西學明白了。如果連最基礎的東西都沒學明白,就直接去學其他更複雜的東西,最後只會越來越難,最終逃脫不了放棄的命運。

讀到了這裡,我相信你也對集合的重要性有了不一樣的認識。那麼接下來一段時間,就讓我和你一起來深入學學集合源碼吧。如果覺得讀了有用,那麼請給我一個贊吧。你們的贊是我繼續寫下去的動力!

楚雄java培訓學校告訴你面試都喜歡問的JAVA集合類?

了一些所謂大公司的Java面試問題,發現對於JAVA集合類的使用都比較看重似的,而自己在這方面還真的是所真甚少,抽空也學習學習吧。

java.util包中就包含了一系列重要的集合類,而對於集合類,主要需要掌握的就是它的內部結構,以及遍歷集合的迭代模式。

接口:Collection

所有集合類的根類型,主要的一個接口方法:booleanadd(Ojbectc)

雖返回的是boolean,但不是表示添加成功與否,因為Collection規定:一個集合拒絕添加這個元素,無論什麼原因,都必須拋出異常,這個返回值表示的意義是add()執行後,集合的內容是否改了(就是元素有無數量、位置等變化)。類似的addAll,remove,removeAll,remainAll也是一樣的。

用Iterator模式實現遍歷集合

Collection有一個重要的方法:iterator(),返回一個Iterator(迭代子),用於遍歷集合的所有元素。Iterator模式可以把訪問邏輯從不同類的集合類中抽象出來,從而避免向客戶端暴露集合的內部結構。

for(Iteratorit=c.iterator();it.hasNext();){…}

不需要維護遍歷集合的“指針”,所有的內部狀態都有Iterator來維護,而這個Iterator由集合類通過工廠方法生成。

每一種集合類返回的Iterator具體類型可能不同,但它們都實現了Iterator接口,因此,我們不需要關心到底是哪種Iterator,它只需要獲得這個Iterator接口即可,這就是接口的好處,面向對象的威力。

要確保遍歷過程順利完成,電腦培訓認為必須保證遍歷過程中不更改集合的內容(Iterator的remove()方法除外),所以,確保遍歷可靠的原則是:只在一個線程中使用這個集合,或者在多線程中對遍歷代碼進行同步。

如何學習JAVA

零基礎學習java可按照這份大綱來進行學習

第一階段:Java專業基礎課程

階段目標:

1. 熟練掌握Java的開發環境與編程核心知識

2. 熟練運用Java面向對象知識進行程序開發

3. 對Java的核心對象和組件有深入理解

4. 熟練應用JavaAPI相關知識

5. 熟練應用JAVA多線程技術

6. 能綜合運用所學知識完成一個項目

知識點:

1、基本數據類型,運算符,數組,掌握基本數據類型轉換,運算符,流程控制。

2、數組,排序算法,Java常用API,類和對象,了解類與對象,熟悉常用API。

3、面向對象特性,集合框架,熟悉面向對象三大特性,熟練使用集合框架。

4、IO流,多線程。

5、網絡協議,線程運用。

第二階段:JavaWEB核心課程

階段目標:

1. 熟練掌握數據庫和MySQL核心技術

2. 深入理解JDBC與DAO數據庫操作

3. 熟練運用JSP及Servlet技術完成網站後台開發

4. 深入理解緩存,連接池,註解,反射,泛型等知識

5. 能夠運用所學知識完成自定義框架

知識點:

1、數據庫知識,範式,MySQL配置,命令,建庫建表,數據的增刪改查,約束,視圖,存儲過程,函數,觸發器,事務,游標,建模工具。

2、深入理解數據庫管理系統通用知識及MySQL數據庫的使用與管理。為Java後台開發打下堅實基礎。Web頁面元素,布局,CSS樣式,盒模型,JavaScript,jQuery。

3、掌握前端開發技術,掌握jQuery。

4、Servlet,EL表達式,會話跟蹤技術,過濾器,FreeMarker。

5、掌握Servlet相關技術,利用Servlet,JSP相關應用技術和DAO完成B/S架構下的應用開發。

6、泛型,反射,註解。

7、掌握JAVA高級應用,利用泛型,註解,枚舉完成自己的CRUD框架開發為後續框架學習做鋪墊。

8、單點登錄,支付功能,項目整合,分頁封裝熟練運用JSP及Servlet核心知識完成項目實戰。

第三階段:JavaEE框架課程

階段目標:

1. 熟練運用Linux操作系統常見命令及完成環境部署和Nginx服務器的配置

2. 熟練運用JavaEE三大核心框架:Spring,SpringMVC,MyBatis

3. 熟練運用Maven,並使用SpringBoot進行快速框架搭建

4. 深入理解框架的實現原理,Java底層技術,企業級應用等

5. 使用Shiro,Ztree和Spring,SpringMVC,Mybaits完成企業項目

知識點:

1、Linux安裝配置,文件目錄操作,VI命令,管理,用戶與權限,環境部署,Struts2概述,hiberante概述。

2、Linux作為一個主流的服務器操作系統,是每一個開發工程師必須掌握的重點技術,並且能夠熟練運用。

3、SSH的整合,MyBatis,SpringMVC,Maven的使用。

4、了解AOP原理,了解中央控制器原理,掌握MyBatis框架,掌握SSM框架的整合。

5、Shiro,Ztree,項目文檔,項目規範,需求分析,原型圖設計,數據庫設計,工程構建,需求評審,配置管理,BUG修復,項目管理等。

6、獨立自主完成一個中小型的企業級綜合項目的設計和整體架構的原型和建模。獨立自主完成一個大型的企業級綜合項目,並具備商業價值

源碼時代的JAVA課程都有些什麼內容?

手機終端,電腦客戶端和web服務器端。

個人認為web服務器端始終是最大的發展方向。

web開發,也就是JavaEE。web開發無疑是Java應用方向的主心骨。服務器端的編程,用Java有一定的優勢,特別是有很多框架可以使用。JavaEE已經火了好多年了,而移動互聯網的發展會將這一勢頭保持下去。好處在於,從服務器的實現角度講,JavaEE的開發並沒有太大變化。有很多人看好安卓終端開發,是因為現在app大行其道。有文章甚至說蘋果已經憑藉app打敗了web,我認為這明顯是沒有經過深入思考得出的結論。

在用戶手機上,能取得最後勝利的必然是手機瀏覽器。現在瀏覽器沒有很明顯的優勢,是因為1.瀏覽器做的還不夠好,不適合在屏幕小的手機上使用;2.網絡還不夠快,瀏覽器得到的數據太慢,而app只要獲取小部分需要的數據就可以了

java中的集合分類

JAVA集合框架特徵介紹(詳細的去看看動力節點的java基礎大全301集就知道了)

數據結構是以某種形式將數據組織在一起的集合,它不僅存儲數據,還支持訪問和處理數據的操作。Java提供了幾個能有效地組織和操作數據的數據結構,這些數據結構通常稱為Java集合框架。在平常的學習開發中,靈活熟練地使用這些集合框架,可以很明顯地提高我們的開發效率,當然僅僅會用還是不夠的,理解其中的設計思想與原理才能更好地提高我們的開發水平。下面是自己對Java集合框架方面的學習總結。

一、概述

二、Collection接口   1.List   2.Set   3.Queue

三、Map接口   1.HashMap實現原理   2.其它Map實現類

四、其它集合類

五、總結

一、概述

在Java 2之前,Java是沒有完整的集合框架的。它只有一些簡單的可以自擴展的容器類,比如Vector,Stack,Hashtable等。這些容器類在使用的過程中由於效率問題飽受詬病,因此在Java 2中,Java設計者們進行了大刀闊斧的整改,重新設計,於是就有了現在的集合框架。需要注意的是,之前的那些容器類庫並沒有被棄用而是進行了保留,主要是為了向下兼容的目的,但我們在平時使用中還是應該盡量少用。

Java集合框架

從上面的集合框架圖可以看到,Java集合框架主要包括兩種類型的容器,一種是集合(Collection),存儲一個元素集合,另一種是圖(Map),存儲鍵/值對映射。Collection接口又有3種子類型,List、Set和Queue,再下面是一些抽象類,最後是具體實現類,常用的有ArrayList、LinkedList、HashSet、LinkedHashSet、HashMap、LinkedHashMap等等。

二、Collection接口

Collection接口是處理對象集合的根接口,其中定義了很多對元素進行操作的方法,AbstractCollection是提供Collection部分實現的抽象類。下圖展示了Collection接口中的全部方法。

Collection接口結構

其中,有幾個比較常用的方法,比如方法add()添加一個元素到集合中,addAll()將指定集合中的所有元素添加到集合中,contains()方法檢測集合中是否包含指定的元素,toArray()方法返回一個表示集合的數組。Collection接口有三個子接口,下面詳細介紹。

1.List

List接口擴展自Collection,它可以定義一個允許重複的有序集合,從List接口中的方法來看,List接口主要是增加了面向位置的操作,允許在指定位置上操作元素,同時增加了一個能夠雙向遍歷線性表的新列表迭代器ListIterator。AbstractList類提供了List接口的部分實現,AbstractSequentialList擴展自AbstractList,主要是提供對鏈表的支持。下面介紹List接口的兩個重要的具體實現類,也是我們可能最常用的類,ArrayList和LinkedList。

ArrayList

通過閱讀ArrayList的源碼,我們可以很清楚地看到裡面的邏輯,它是用數組存儲元素的,這個數組可以動態創建,如果元素個數超過了數組的容量,那麼就創建一個更大的新數組,並將當前數組中的所有元素都複製到新數組中。假設第一次是集合沒有任何元素,下面以插入一個元素為例看看源碼的實現。

1、方法add(E e)向集合中添加指定元素。   public boolean add(E e) {

ensureCapacityInternal(size + 1);  // Increments modCount!!

elementData[size++] = e;        return true;

}2、此方法主要是確定將要創建的數組大小。  private void ensureCapacityInternal(int minCapacity) {        if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {

minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);

}

ensureExplicitCapacity(minCapacity);

}    private void ensureExplicitCapacity(int minCapacity) {

modCount++;        if (minCapacity – elementData.length 0)

grow(minCapacity);

}3、最後是創建數組,可以明顯的看到先是確定了添加元素後的大小之後將元素複製到新數組中。    private void grow(int minCapacity) {        // overflow-conscious code        int oldCapacity = elementData.length;        int newCapacity = oldCapacity + (oldCapacity 1);        if (newCapacity – minCapacity 0)

newCapacity = minCapacity;        if (newCapacity – MAX_ARRAY_SIZE 0)

newCapacity = hugeCapacity(minCapacity);        // minCapacity is usually close to size, so this is a win:

elementData = Arrays.copyOf(elementData, newCapacity);

}

LinkedList

同樣,我們打開LinkedList的源文件,不難看到LinkedList是在一個鏈表中存儲元素。

在學習數據結構的時候,我們知道鏈表和數組的最大區別在於它們對元素的存儲方式的不同導致它們在對數據進行不同操作時的效率不同,同樣,ArrayList與LinkedList也是如此,實際使用中我們需要根據特定的需求選用合適的類,如果除了在末尾外不能在其他位置插入或者刪除元素,那麼ArrayList效率更高,如果需要經常插入或者刪除元素,就選擇LinkedList。

2.Set

Set接口擴展自Collection,它與List的不同之處在於,規定Set的實例不包含重複的元素。在一個規則集內,一定不存在兩個相等的元素。AbstractSet是一個實現Set接口的抽象類,Set接口有三個具體實現類,分別是散列集HashSet、鏈式散列集LinkedHashSet和樹形集TreeSet。

散列集HashSet

散列集HashSet是一個用於實現Set接口的具體類,可以使用它的無參構造方法來創建空的散列集,也可以由一個現有的集合創建散列集。在散列集中,有兩個名詞需要關注,初始容量和客座率。客座率是確定在增加規則集之前,該規則集的飽滿程度,當元素個數超過了容量與客座率的乘積時,容量就會自動翻倍。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/295151.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-26 17:15
下一篇 2024-12-26 17:15

相關推薦

  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java Bean加載過程

    Java Bean加載過程涉及到類加載器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean加載的過程。 一、類加載器 類加載器是Java虛擬機…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發布。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Java判斷字符串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字符串中是否存在多個指定字符: 一、字符串遍歷 字符串是Java編程中非常重要的一種數據類型。要判斷字符串中是否存在多個指定字符…

    編程 2025-04-29
  • VSCode為什麼無法運行Java

    解答:VSCode無法運行Java是因為默認情況下,VSCode並沒有集成Java運行環境,需要手動添加Java運行環境或安裝相關插件才能實現Java代碼的編寫、調試和運行。 一、…

    編程 2025-04-29
  • Java任務下發回滾系統的設計與實現

    本文將介紹一個Java任務下發回滾系統的設計與實現。該系統可以用於執行複雜的任務,包括可回滾的任務,及時恢復任務失敗前的狀態。系統使用Java語言進行開發,可以支持多種類型的任務。…

    編程 2025-04-29
  • Java 8 Group By 會影響排序嗎?

    是的,Java 8中的Group By會對排序產生影響。本文將從多個方面探討Group By對排序的影響。 一、Group By的概述 Group By是SQL中的一種常見操作,它…

    編程 2025-04-29

發表回復

登錄後才能評論