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

你真的理解Java中的ArrayList嗎

 更新時間:2021年08月05日 10:34:57   作者:Jack·Kwok  
這篇文章主要給大家介紹了關(guān)于Java中ArrayList的相關(guān)資料,ArrayList就是傳說中的動態(tài)數(shù)組,用MSDN中的說法,就是Array的復雜版本,需要的朋友可以參考下

1. 為什么需要ArrayList?

圖1 圖2

記得在剛剛學習Java的時候,我們首先是學習了數(shù)組,這是我們學到的第一個可以存儲多個對象的實例或者基本類型的具體值,數(shù)組存儲的特點如下:

  1. 只能存儲同種類型的數(shù)據(jù)。
  2. 在定義數(shù)組時,必須指定該數(shù)組的大小,并且在不改變數(shù)組的前提下,不可修改其長度。

以上特性就會導致很多弊端。比如:我們往往不希望數(shù)組只能存儲一種數(shù)據(jù),而是希望存儲我們想要存儲的數(shù)據(jù),最好是在想要存儲的時候根據(jù)數(shù)據(jù)的類型指定存儲的類型。其次,我們也不想一開始就指定好數(shù)據(jù)的長度,而是希望這個數(shù)組的容量可以隨著我的數(shù)據(jù)的多少的改變而改變。

基于以上的弊端,Java中出現(xiàn)了集合。這是一種新的容器可以用來存儲數(shù)據(jù),而集合的存儲方式有多種,常見的有鏈式存儲(LinkedList)和順序存儲(ArrayList)。

鏈式存儲底層是用一個個節(jié)點(Node)鏈接而成的,每個節(jié)點都存儲著一個對象值和下一個節(jié)點的位置(或上一個節(jié)點的位置)。

順序存儲底層是用一個數(shù)組存儲數(shù)據(jù)的,對于數(shù)組的弊端,順序存儲集合底層使用了ensureCapacity這個方法不斷擴容,ensureCapacity這個單詞字面翻譯是 保證能力。顧名思義,由于底層是一個數(shù)組,當我們存入一個對象時,我們需要保證數(shù)組是有空余位置的,因此在添加元素的時候,Java源碼會先經(jīng)過這個方法進行判斷底層數(shù)組是否滿了,若滿了則會擴容數(shù)組(上面提到數(shù)組是不能直接擴容的,這里實際上是重新創(chuàng)建了一個更大空間的數(shù)組并把元素“搬運”過去)。這樣就解決了數(shù)組的一個弊端。而對于另一個弊端,Java則是巧妙的運用了泛型。泛型的內(nèi)容非常繁多,這里結(jié)合實例希望大家可以更好的理解。

想象一下現(xiàn)在有一個需求,需要你實現(xiàn)一個的多值加法,但傳入的參數(shù)的類型是不確定的,可以有Integer,String,Double等等。這時候如果你用的是數(shù)組作為參數(shù),那么那你肯定會想,最粗糙的方法是分別寫多個加法方法,對應不同的類型,但很明顯,代碼可讀性極差,那如果使用Object數(shù)組,然后再根據(jù)數(shù)據(jù)類型,轉(zhuǎn)換為對應的類型再計算?這樣也存在弊端!你根本不知道需要轉(zhuǎn)換為什么類型才合適。因此,針對這種情況,使用泛型集合是最合適的,我們只需要在傳入?yún)?shù)的時候使用泛型類型,而因為不同類型計算的過程是一致的,因此結(jié)果并沒有差別,也不會導致報錯。

2. ArrayList底層是如何實現(xiàn)的?

簡單介紹了ArrayList的用途以及和數(shù)組的區(qū)別,那么根據(jù)上面的講解,你應該大致了解它的實現(xiàn)原理了吧!

先不看源碼,如果你有一些數(shù)據(jù)結(jié)構(gòu)與算法的基礎的話,你應該可以馬上得出下面結(jié)論:先在ArrayList類定義一個數(shù)組,接著定義一個添加,一個刪除,一個查詢,一個修改方法。實際上是對數(shù)組的操作,那么,刪除和添加可能需要移動大量的元素,這些都是在源碼中實現(xiàn),但對應到效率也會很低,其次還需要一個擴容數(shù)組的方法。

如果你能想到上面這些,恭喜你,你已經(jīng)掌握的很不錯。事實上,ArrayList的源碼確實包含以上方法,只不過還需要加上迭代器以及構(gòu)造方法等。迭代器的出現(xiàn)是為了適應增強for語句(后面會細說),構(gòu)造方法是為了初始化集合。

3. 結(jié)合源碼分析主要成員變量

ArrayList繼承AbstractList這個抽象類和List接口

List

接口繼承Collection接口(實際上集合還有map集合等)

而Collection則是繼承了Iterable(可迭代的),Collection中包含了集合中通用的方法,包括增刪改查,只不過都未實現(xiàn)。而Iterable則是只有一個forEach方法,提供迭代。

接著我們回到ArrayList類,這是底層維護的數(shù)組,實際上對象存儲的地方

,

記錄集合的長度

返回集合的長度

判斷集合是否為空

根據(jù)索引獲取元素

添加元素

添加元素到指定位置

刪除元素

內(nèi)部類的next方法實現(xiàn)迭代功能(我們平時使用增強for語句的判斷條件就是根據(jù)判斷是否有next值來實現(xiàn)的)

4. 個人的一點總結(jié)

Java的設計者很巧妙的設計了Java中的每個功能,很多時候,我們會覺得說我手動實現(xiàn)簡單的集合不需要這么復雜的代碼呀?甚至有些功能都不需要單獨作為一個方法。但這就是Java的魅力啊!

以前剛學代碼的我們,把代碼全都丟到main方法里面,我們會覺得提取出來是多么復雜,但當我們知道功能是有區(qū)別的,我們才知道這樣子做的用處。
曾經(jīng)有個老師這么對我說,他說你知道為什么我們要費盡心思去設計各種類之間的關(guān)系,接口,抽象類,泛型等等嗎?那時候的我一臉茫然,他對我說,打個比方,你見過賣水果的店里還賣手機的嗎?我聽完后恍然大悟,對于一個小城鎮(zhèn),確實可能存在一個小店賣著各種雜七雜八的東西,但一個千萬人口的大城市,是做不到的,這是格局啊!各種功能,各種設施都應該井井有條,關(guān)系明確。面向?qū)ο笠埠?,設計模式也好,一切的功能都是為了大型程序做準備,這也是為什么Java一直可以大型應用的后端程序語言之一。

到此這篇關(guān)于Java中ArrayList的文章就介紹到這了,更多相關(guān)Java中ArrayList內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JAVA 中的大數(shù)字操作類詳解

    JAVA 中的大數(shù)字操作類詳解

    Java的BigInteger類用于處理超出int和long范圍的大整數(shù),而BigDecimal類則用于高精度的浮點數(shù)運算,這兩個類都是Number的子類,提供了一系列方法執(zhí)行加減乘除等運算,BigInteger不支持表示小數(shù),只能表示整數(shù),BigDecimal可以控制小數(shù)位數(shù)和舍入方式,感興趣的朋友一起看看吧
    2024-10-10
  • IDEA正則表達式全局搜索圖文教程

    IDEA正則表達式全局搜索圖文教程

    當您要搜索和替換特定的文本模式時,請使用正則表達式,下面這篇文章主要給大家介紹了關(guān)于IDEA正則表達式全局搜索的相關(guān)資料,文中通過代碼以及圖文介紹的非常詳細,需要的朋友可以參考下
    2024-08-08
  • java開發(fā)中嵌套類的詳解及實例

    java開發(fā)中嵌套類的詳解及實例

    這篇文章主要介紹了 java開發(fā)中嵌套類的詳解及實例的相關(guān)資料,一般把定義內(nèi)部類的外圍類成為包裝類(enclosing class)或者外部類,需要的朋友可以參考下
    2017-07-07
  • 列舉java語言中反射的常用方法及實例代碼

    列舉java語言中反射的常用方法及實例代碼

    反射機制指的是程序在運行時能夠獲取自身的信息。這篇文章主要介紹了列舉java語言中反射的常用方法,需要的朋友可以參考下
    2019-07-07
  • spring-cloud入門之eureka-client(服務注冊)

    spring-cloud入門之eureka-client(服務注冊)

    本篇文章主要介紹了spring-cloud入門之eureka-client(服務注冊),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-01-01
  • 最新評論