国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

探索Java集合框架—數(shù)據(jù)結(jié)構(gòu)、ArrayList集合

這篇具有很好參考價值的文章主要介紹了探索Java集合框架—數(shù)據(jù)結(jié)構(gòu)、ArrayList集合。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

一、背景介紹

Java集合的使用相信大家都已經(jīng)非常得心應(yīng)手,但是我們怎么做到知其然,更知其所以然這種出神入化的境界呢?我們揭開集合框架底層神秘面紗來一探究竟

目錄

一、背景介紹

二、思路&方案

數(shù)據(jù)結(jié)構(gòu)是什么?

數(shù)據(jù)結(jié)構(gòu)可以分為線性和非線性兩種數(shù)據(jù)結(jié)構(gòu)

線性數(shù)據(jù)結(jié)構(gòu):

非線性數(shù)據(jù)結(jié)構(gòu):

Java集合分類

Collection接口:

Map接口:

三、過程

ArrayList和LinkedList的區(qū)別有哪些?

ArrayList是如何存儲數(shù)據(jù)的?

ArrayList擴容機制

①、如何進行擴容的?

②、增加元素

③、ArrayList給指定位置插入元素

④、刪除元素

按照下標位置刪除元素

按照內(nèi)容刪除元素

四、總結(jié)


二、思路&方案

在說集合之前我們要先了解數(shù)據(jù)結(jié)構(gòu)這一概念

數(shù)據(jù)結(jié)構(gòu)是什么?

數(shù)據(jù)結(jié)構(gòu)時對數(shù)據(jù)進行組織和存儲一種方式,數(shù)據(jù)使用不同的數(shù)據(jù)結(jié)構(gòu)組織和存儲時所帶來的時間和空間性能也是不同的。List、Set、Map集合背后使用了不同的數(shù)據(jù)結(jié)構(gòu),我們理解為集合是一種數(shù)據(jù)結(jié)構(gòu)的具體實現(xiàn)。例如:可以使用數(shù)組結(jié)構(gòu)來實現(xiàn)集合,當訪問數(shù)組元素的時候通過數(shù)組下標查找時更快。

程序=數(shù)據(jù)結(jié)構(gòu)+算法。數(shù)據(jù)結(jié)構(gòu)還提供了一些各種查找、排序算法,集合可以用來解決一堆數(shù)據(jù)的處理問題,如:查找、排序、去重等等

數(shù)據(jù)結(jié)構(gòu)可以分為線性和非線性兩種數(shù)據(jù)結(jié)構(gòu)

線性數(shù)據(jù)結(jié)構(gòu):

特點:

一對一的關(guān)系并且邏輯上有序,數(shù)據(jù)元素之間存在一個前后關(guān)系,每個元素只有一個直接前驅(qū)和一個直接后去

組成:
  • 數(shù)組(Array):相同類型元素并且連續(xù)存儲
  • 鏈表(LinkedList):一系列node節(jié)點,每個節(jié)點包括數(shù)據(jù)、指向下一個節(jié)點的指針
  • 棧(Stack):先進后出(LIFO),在棧頂進行刪除和插入操作
  • 隊列(Queue):先進先出(FIFO),在隊尾插入、對頭刪除元素

探索Java集合框架—數(shù)據(jù)結(jié)構(gòu)、ArrayList集合,java集合,arraylist,List集合

非線性數(shù)據(jù)結(jié)構(gòu):

特點:

多對多關(guān)系,數(shù)據(jù)元素之間不存在直接的前后關(guān)系,元素和元素之間通過指針相連,

包括:
  • 樹(Tree):一組node節(jié)點組成,每個父節(jié)點下級可以有子節(jié)點,節(jié)點之間是上下層次關(guān)系
  • 圖(Graph):一組節(jié)點、邊之間的關(guān)系
  • 堆(Heap):實現(xiàn)優(yōu)先隊列
  • 散列表(Hash Table):根據(jù)關(guān)鍵字可以直接查詢數(shù)據(jù),通過散列函數(shù)確認存儲位置

探索Java集合框架—數(shù)據(jù)結(jié)構(gòu)、ArrayList集合,java集合,arraylist,List集合

結(jié)合上面講到的數(shù)據(jù)結(jié)構(gòu),我們來看下Java究竟是如何應(yīng)用的


Java集合分類

探索Java集合框架—數(shù)據(jù)結(jié)構(gòu)、ArrayList集合,java集合,arraylist,List集合

集合相關(guān)類和接口都在java.util中,從宏觀上我們把Java集合分為了以Collection為中心的實現(xiàn)類、以Map為中心的實現(xiàn)類,?Collection和Map兩個接口下面分別有不同的實現(xiàn)類,它們都是用來存儲和操作數(shù)據(jù)的集合

Collection接口:

特點:

一組對象的集合,通過索引或迭代器訪問元素,元素可以重復(fù)

包括:
  • List:有序集合
  • Set:無序集合
  • Queue:先進先出集合

Map接口:

特點:

鍵值對映射的集合,通過key查找value,每個key是唯一的

包括:
  • HashMap:通過哈希表實現(xiàn),無序
  • TreeMap:基于紅黑樹實現(xiàn),有序
  • LinkedHashMap:哈希表+雙向鏈表實現(xiàn),順序插入

今天先重點來講講List集合中ArrayList增刪改查是如何實現(xiàn)的


三、過程

ArrayList和LinkedList的區(qū)別有哪些?

探索Java集合框架—數(shù)據(jù)結(jié)構(gòu)、ArrayList集合,java集合,arraylist,List集合

ArrayList是如何存儲數(shù)據(jù)的?

底層是數(shù)組,數(shù)組存儲的數(shù)據(jù)的特點是元素類型相同并且數(shù)組容量固定

數(shù)組存儲容量固定?那在實際業(yè)務(wù)場景中數(shù)據(jù)肯定是不固定的呀?如何解決?

ArrayList擴容機制

ArrayList提供了自動擴容機制,當插入數(shù)據(jù)時候底層會先判斷是否需要擴容,如果當前容量+1超過數(shù)組長度,就會進行擴容,反之。

①、如何進行擴容的?

ArrayList內(nèi)部封裝了一個動態(tài)再分配的對象數(shù)組,ArrayList的底層數(shù)據(jù)庫初始容量為10,擴容因子為1.5

探索Java集合框架—數(shù)據(jù)結(jié)構(gòu)、ArrayList集合,java集合,arraylist,List集合

探索Java集合框架—數(shù)據(jù)結(jié)構(gòu)、ArrayList集合,java集合,arraylist,List集合

?探索Java集合框架—數(shù)據(jù)結(jié)構(gòu)、ArrayList集合,java集合,arraylist,List集合

②、增加元素

當我們第一次添加元素使用add()方法添加元素的過程中,底層的流程是這樣的:

內(nèi)部會調(diào)用ensureExplicitCapacity()方法判斷添加元素之后的數(shù)組長度是否大于數(shù)組容量,如果超出數(shù)組容量調(diào)用grow()方法擴容,否則給數(shù)組長度+1

探索Java集合框架—數(shù)據(jù)結(jié)構(gòu)、ArrayList集合,java集合,arraylist,List集合

當?shù)谝淮螌?shù)組進行add添加元素的時候,才會把內(nèi)部的數(shù)組擴容為10,這也是數(shù)組的第一次擴容

?注意:

  • 數(shù)組長度是指當前數(shù)組內(nèi)元素的個數(shù)
  • 數(shù)組容量是指數(shù)組所能容納的長度

示意圖:

探索Java集合框架—數(shù)據(jù)結(jié)構(gòu)、ArrayList集合,java集合,arraylist,List集合

那如果要添加的元素不足數(shù)組容量呢?現(xiàn)在我們來看下具體是如何擴容的?

假設(shè)場景:數(shù)組中已經(jīng)有10個元素,需要添加第11個元素

calculateCapacity方法內(nèi)部首先會判斷elementData數(shù)組是否是默認的空數(shù)組(看是否往數(shù)組里面添加了元素),如果不是默認數(shù)組則返回添加元素之后數(shù)組所需要的長度

探索Java集合框架—數(shù)據(jù)結(jié)構(gòu)、ArrayList集合,java集合,arraylist,List集合

如果添加元素之后的數(shù)組長度超出了數(shù)組容量,則說明需要擴容,調(diào)用grow()方法進行擴容

探索Java集合框架—數(shù)據(jù)結(jié)構(gòu)、ArrayList集合,java集合,arraylist,List集合

?grow()方法內(nèi)部會調(diào)用一個交copyOf方法進行擴容,會創(chuàng)建一個1.5倍的新數(shù)組,將原來的數(shù)組元素挪到新數(shù)組中

此時ArrayList擴容為原來的大小+原來大小/2=10+5=15,數(shù)組擴容后容量為15

探索Java集合框架—數(shù)據(jù)結(jié)構(gòu)、ArrayList集合,java集合,arraylist,List集合

?擴容后的數(shù)組示意圖如下:探索Java集合框架—數(shù)據(jù)結(jié)構(gòu)、ArrayList集合,java集合,arraylist,List集合

add(E e)添加元素的流程為:

第一步、判斷是否需要擴容:

? ? ? ? 需要擴容

? ? ? ? ? ? ? ? ①、計算新數(shù)組容量:newCapacity = oldCapacity + (oldCapacity >> 1)

? ? ? ? ? ? ??? ②、創(chuàng)建新數(shù)組:elementData = Arrays.copyOf(elementData, newCapacity)

第二步、追加元素到數(shù)組末尾 。 ?elementData[size++] =element;

第三步、添加成功

③、ArrayList給指定位置插入元素

示例:

探索Java集合框架—數(shù)據(jù)結(jié)構(gòu)、ArrayList集合,java集合,arraylist,List集合

添加指定位置流程如下:

第一步、檢查下標是否越界

? ? ? ? 越界:拋出IndexOutOfBoundsException異常

第二步、判斷是否需要擴容,如果需要擴容則擴容

第三步、后移元素.從指定要插入元素位置依次向后移動一個位置,此時指定要插入的位置為空

第四步、插入新元素。將要插入的元素放入指定位置

第五步、更新數(shù)組大小。size+1

? ? ? ??

注意: 其中rangeCheckForAdd(index)方法會檢查下標是否越界,如果要插入的元素位置超出了當前數(shù)組的容量,會拋出”IndexOutOfBoundsException“的異常

探索Java集合框架—數(shù)據(jù)結(jié)構(gòu)、ArrayList集合,java集合,arraylist,List集合

?示意圖:探索Java集合框架—數(shù)據(jù)結(jié)構(gòu)、ArrayList集合,java集合,arraylist,List集合

④、刪除元素

按照下標位置刪除元素

探索Java集合框架—數(shù)據(jù)結(jié)構(gòu)、ArrayList集合,java集合,arraylist,List集合

探索Java集合框架—數(shù)據(jù)結(jié)構(gòu)、ArrayList集合,java集合,arraylist,List集合

按照內(nèi)容刪除元素

探索Java集合框架—數(shù)據(jù)結(jié)構(gòu)、ArrayList集合,java集合,arraylist,List集合


四、總結(jié)

通過分析源碼我們了解了ArrayList底層增刪改查操作具體的細節(jié),再次總結(jié)

探索Java集合框架—數(shù)據(jù)結(jié)構(gòu)、ArrayList集合,java集合,arraylist,List集合文章來源地址http://www.zghlxwxcb.cn/news/detail-684321.html

到了這里,關(guān)于探索Java集合框架—數(shù)據(jù)結(jié)構(gòu)、ArrayList集合的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 【數(shù)據(jù)結(jié)構(gòu)】搜索樹 與 Java集合框架中的Set,Map

    【數(shù)據(jù)結(jié)構(gòu)】搜索樹 與 Java集合框架中的Set,Map

    作者主頁:paper jie_博客 本文作者:大家好,我是paper jie,感謝你閱讀本文,歡迎一建三連哦。 本文錄入于《JAVA數(shù)據(jù)結(jié)構(gòu)》專欄,本專欄是針對于大學(xué)生,編程小白精心打造的。筆者用重金(時間和精力)打造,將javaSE基礎(chǔ)知識一網(wǎng)打盡,希望可以幫到讀者們哦。 其他專欄:《

    2024年02月08日
    瀏覽(30)
  • [JAVA數(shù)據(jù)結(jié)構(gòu)]順序表ArrayList

    [JAVA數(shù)據(jù)結(jié)構(gòu)]順序表ArrayList

    目錄 1.線性表 2.順序表 3.ArrayList簡介 4.ArrayList的使用? 4.1ArrayList的構(gòu)造方法 4.2ArrayList的常用操作 4.3ArrayList的遍歷方法 4.4ArrayList的擴容機制 5.ArrayList的具體運用 ArrayList是一種基于數(shù)組的數(shù)據(jù)結(jié)構(gòu),是線性表的一種,也是順序表。 通俗來說,線性表是一種線性結(jié)構(gòu),在邏輯上

    2023年04月26日
    瀏覽(19)
  • 【Java--數(shù)據(jù)結(jié)構(gòu)】模擬實現(xiàn)ArrayList

    【Java--數(shù)據(jù)結(jié)構(gòu)】模擬實現(xiàn)ArrayList

    歡迎關(guān)注個人主頁:逸狼 創(chuàng)造不易,可以點點贊嗎~ 如有錯誤,歡迎指出~ 目錄 LIst 順序表ArrayList 順序表優(yōu)點 IList接口 ArrayList中定義要操作的數(shù)組 在MyArrayList中 重寫接口方法 新增元素 在指定位置插入元素 ?pos不合法異常 判斷和查找元素 獲取和更新元素 刪除元素和清空順序

    2024年04月25日
    瀏覽(28)
  • 【數(shù)據(jù)結(jié)構(gòu)】 初識集合框架

    【數(shù)據(jù)結(jié)構(gòu)】 初識集合框架

    這里博主將簡單介紹一下集合框架,想要詳細了解的可以點擊下方鏈接進行查看 java集合官方教程 Java 集合框架 Java Collection Framework ,又被稱為容器 container ,是定義在 java.util 包下的一組接口 interfaces 和其實現(xiàn)類 classes 。 其主要表現(xiàn)為將多個元素 element 置于一個單元中,用于

    2024年02月13日
    瀏覽(18)
  • 數(shù)據(jù)結(jié)構(gòu) 之 順序表 ArrayList (Java)

    數(shù)據(jù)結(jié)構(gòu) 之 順序表 ArrayList (Java)

    ??歡迎大家觀看AUGENSTERN_dc的文章(o゜▽゜)o☆?? ??感謝各位讀者在百忙之中抽出時間來垂閱我的文章,我會盡我所能向的大家分享我的知識和經(jīng)驗?? ??希望我們在一篇篇的文章中能夠共同進步?。。???個人主頁: AUGENSTERN_dc ??個人專欄: C語言 ?| ?Java | 數(shù)據(jù)結(jié)構(gòu) ?個

    2024年03月17日
    瀏覽(25)
  • Java 中數(shù)據(jù)結(jié)構(gòu)ArrayList的用法

    ArrayList 類是一個可以動態(tài)修改的數(shù)組,與普通數(shù)組的區(qū)別就是它是沒有固定大小的限制,我們可以添加或刪除元素。 ArrayList 繼承了 AbstractList ,并實現(xiàn)了 List 接口。 add() 將元素插入到指定位置的 arraylist 中 addAll() 添加集合中的所有元素到 arraylist 中 clear() 刪除 arraylist 中的所

    2024年02月10日
    瀏覽(25)
  • 數(shù)據(jù)結(jié)構(gòu)(Java實現(xiàn))-ArrayList與順序表

    數(shù)據(jù)結(jié)構(gòu)(Java實現(xiàn))-ArrayList與順序表

    什么是List List是一個接口,繼承自Collection。 List的使用 List是個接口,并不能直接用來實例化。 如果要使用,必須去實例化List的實現(xiàn)類。在集合框架中,ArrayList和LinkedList都實現(xiàn)了List接口。 線性表 線性表(linear list)是n個具有相同特性的數(shù)據(jù)元素的有限序列。 常見的線性表

    2024年02月11日
    瀏覽(26)
  • 集合框架及背后的數(shù)據(jù)結(jié)構(gòu)

    大家好,我是曉星航。今天為大家?guī)淼氖?集合框架及背后的數(shù)據(jù)結(jié)構(gòu) 的講解!?? 官方教程 Java 集合框架 Java Collection Framework ,又被稱為容器 container ,是定義在 java.util 包下的一組接口 interfaces 和其實現(xiàn)類 classes 。 其主要表現(xiàn)為將多個元素 element 置于一個單元中,用于對

    2024年01月18日
    瀏覽(18)
  • [java數(shù)據(jù)結(jié)構(gòu)] ArrayList和LinkedList介紹與使用

    [java數(shù)據(jù)結(jié)構(gòu)] ArrayList和LinkedList介紹與使用

    (一) 線性表 (二) ArrayList 1. ArrayList的介紹 2. ArrayList的常見方法和使用 3. ArrayList的遍歷 4. ArrayList的模擬實現(xiàn) 5. ArrayList的優(yōu)缺點 (三)?LinkedList 1. LinkedList的介紹 2. LinkedList的常見方法和使用 3. LinkedList的遍歷 4. LinkedList的模擬實現(xiàn) 5. LinkedList的優(yōu)缺點 (四) ArrayList和LinkedList的區(qū)別

    2024年01月21日
    瀏覽(17)
  • java八股文面試[數(shù)據(jù)結(jié)構(gòu)]——ArrayList和LinkedList區(qū)別

    java八股文面試[數(shù)據(jù)結(jié)構(gòu)]——ArrayList和LinkedList區(qū)別

    ? ArrayList和LinkedList的異同 二者的線程都不安全,相對線程安全的Vector,執(zhí)行效率高。此外,ArrayList時實現(xiàn)了基于動態(tài)數(shù)組的數(shù)據(jù)結(jié)構(gòu),LinkedList基于鏈表的數(shù)據(jù)結(jié)構(gòu),對于隨機訪問get和set,ArrayList覺得優(yōu)于LinkedList比較占優(yōu)勢,因為LinledList要移動指針。對于新增和刪除操作add

    2024年02月11日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包