集合篇之ArrayList

一、源碼如何分析?

1.成員變量

2.構造方法

3.關鍵方法

? ? ? ? 一些添加的方法。

二、debug看源碼

我們給出下面代碼:

    public void test01() {ArrayList<Integer> list = new ArrayList<>();list.add(1);for (int i = 2; i <= 10; i++) {list.add(i);}list.add(11);}

1.第一次添加數據

1. 添加方法:

2. 確保內部容量:

3. 計算容量:

4. 確保真正的容量:

5. 擴容的方法:

圍繞著這5個方法進行講解:

? ? ? ? 首先,add()方法里面先執行ensureCapacityInternal(size + 1); 這里的size是0,因為數組是空的,所以傳入到ensureCapacityInternal()方法的參數就是minCapacity?==?1

? ? ? ? 其次,我們就需要計算容量,在calculateCapacity()方法中,里面的傳入的兩個參數,其中第一個參數elementData的值,在ArrayList() 構造方法里面已經賦過值了,就是DEFAULTCAPACITY_EMPTY_ELEMENTDATA,第二個參數就是前面的 1 。所以if里面判斷正確,返回最大值,其中DEFAULT_CAPACITY = 10,所以10>1,最后返回的也就是10

? ? ? ? 然后,我們在ensureExplicitCapacity()中這個方法,傳入的minCapacity這個參數也就是 10。因為在if判斷中,條件成立,也就是說容量不夠,需要擴容了。

? ? ? ? 最后,進入grow()方法,其中因為oldCapacity=0,newCapacity計算得出也是0。第一個條件判斷就是0-10<0,所以把10賦值給newCapacity,第二個是數組容量最大的安全校驗(暫時不用),最后一行代碼也就是數組的拷貝,把elementData的容量變成了 10 。

? ? ? ? 這樣,我們的數組第一次擴容就這樣說完了,我們回到add方法,elementData[size++] = e,這行代碼就是把下標為0的位置給了元素1,然后size+1,說明數組有一個元素了。

2.第二次添加數據

? ? ? ? 我們第二次添加是用for循環,添加了9個元素,我們分析這個過程。

? ? ? ? 首先,for循環添加第一個元素的時候,ensureCapacityInternal(size + 1); 這里的size是1,因為數組之前添加了一個元素進行了size++,所以傳入到ensureCapacityInternal()方法的參數就是minCapacity?== 2。

? ? ? ? 其次,在計算容量的時候,elementData已經不是默認的了,所以直接返回minCapacity。

? ? ? ? 然后,我們在ensureExplicitCapacity()中這個方法里面,在if判斷里面,其中minCapacity是等于2的,elementData.length在第一次添加數據的時候,已經擴容為10了,所以2-10<0,不需要擴容了。在代碼里面,for循環添加了9個元素,執行流程都一樣。

? ? ? ? 最后,在add方法里面,把數據添加到數組后進行size+1。

3.第三次添加數據

????????我們第三次添加一個元素,其中數組已經有10個元素了,我們分析這個過程。

????????首先,ensureCapacityInternal(size + 1); 這里的size是10,因為數組里面有了10個元素,所以傳入到ensureCapacityInternal()方法的參數就是minCapacity?== 11。

????????其次,在計算容量的時候,elementData已經不是默認的了,所以直接返回minCapacity。

????????然后,我們在ensureExplicitCapacity()中這個方法,傳入的minCapacity這個參數也就是 11。因為在if判斷中,條件成立11-10>0,也就是說容量不夠,需要擴容了。

????????最后,進入grow()方法,其中因為oldCapacity=10,?oldCapacity >> 1也就是右移一位也就是5,newCapacity計算得出是15。第一個條件判斷就是15-10>0,直接走過該判斷,最后一行代碼也就是數組的拷貝,把elementData的容量變成了 15 。

???????? 這樣,我們的數組擴容就完成了。

三、面試題

1. ArrayList底層的實現原理是什么?

  • 底層數據結構

ArrayList底層是用動態的數組實現的

  • 初始容量

ArrayList初始容量為0,當第一次添加數據的時候才會初始化容量為10

  • 擴容邏輯

ArrayList在進行擴容的時候是原來容量的1.5倍,每次擴容都需要拷貝數組

  • 添加邏輯

    • 確保數組已使用長度(size)加1之后足夠存下下一個數據

    • 計算數組的容量,如果當前數組已使用長度+1后的大于當前的數組長度,則調用grow方法擴容(原來的1.5倍)

    • 確保新增的數據有地方存儲之后,則將新元素添加到位于size的位置上。

    • 返回添加成功布爾值。

2.? ArrayList list=new ArrayList(10)中的list擴容幾次?

該語句只是聲明和實例了一個 ArrayList,指定了容量為 10,未擴容。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/711624.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/711624.shtml
英文地址,請注明出處:http://en.pswp.cn/news/711624.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

H5:段落標簽與換行標簽

目錄 一.前言 二.正文 1.段落標簽 2.換行標簽 三.結語 一.前言 學習前端&#xff0c;從此起飛&#xff0c;愿你堅持&#xff0c;直至等頂。 二.正文 1.段落標簽 <p></p> p為段落標簽&#xff0c;由英文paragraph簡寫而來&#xff0c;用于將一段某一部分文本&am…

算法練習第九天|232.用棧實現隊列、225. 用隊列實現棧

熟悉棧和隊列的方法&#xff1b;熟悉棧和隊列的數據結構&#xff0c;不涉及算法 232.用棧實現隊列 import java.util.Stack; class MyQueue {//負責進棧的Stack<Integer> stackIn;//負責出棧的Stack<Integer> stackOut;public MyQueue() {stackIn new Stack<&…

Rocketmq 入門介紹

從零手寫實現 mq 詳細介紹一下 rocketmq RocketMQ 是由阿里巴巴開發的分布式消息隊列系統&#xff0c;它是一個低延遲、高可靠、高吞吐量的消息中間件。 RocketMQ 最初是作為阿里巴巴的內部項目進行開發的&#xff0c;后來成為了 Apache 軟件基金會下的頂級項目&#xff0c;以…

精讀《React 高階組件》

本期精讀文章是&#xff1a;React Higher Order Components in depth 1 引言 高階組件&#xff08; higher-order component &#xff0c;HOC &#xff09;是 React 中復用組件邏輯的一種進階技巧。它本身并不是 React 的 API&#xff0c;而是一種 React 組件的設計理念&…

【QT+QGIS跨平臺編譯】之五十三:【QGIS_CORE跨平臺編譯】—【qgssqlstatementparser.cpp生成】

文章目錄 一、Bison二、生成來源三、構建過程一、Bison GNU Bison 是一個通用的解析器生成器,它可以將注釋的無上下文語法轉換為使用 LALR (1) 解析表的確定性 LR 或廣義 LR (GLR) 解析器。Bison 還可以生成 IELR (1) 或規范 LR (1) 解析表。一旦您熟練使用 Bison,您可以使用…

transformers文本相似度

在自然語言處理(NLP)中,文本相似度是衡量兩個文本之間語義或結構相似程度的一個重要概念。計算文本相似度的方法多種多樣,適應不同的應用場景和需求。以下是一些常見的文本相似度計算方法: 1、余弦相似度: 通過將文本轉換為向量表示(例如,使用詞袋模型、TF-IDF 或 wor…

2024年個人護理賽道選品風向在哪?這份賽盈分銷選品攻略必看!

2024年還會卷下去嗎&#xff1f;看到一位行業大佬分享的內容深有感觸&#xff1a;堅定做好產品&#xff0c;不做大賣&#xff0c;就不存在卷不卷。 有人出局&#xff0c;也會有人入局&#xff0c;并且深耕領域做大做強。 專注口腔護理的Bitvae入行不到兩年&#xff0c;憑借一款…

C#學習(十四)——垃圾回收、析構與IDisposable

一、何為GC 數據是存儲在內存中的&#xff0c;而內存又分為Stack棧內存和Heap堆內存 Stack棧內存Heap堆內存速度快、效率高結構復雜類型、大小有限制對象只能保存簡單的數據引用數據類型基礎數據類型、值類型- 舉個例子 var c new Customer{id: 123,name: "Jack"…

Java中String類有哪些常用方法?

Java中的String類提供了許多有用的方法&#xff0c;用于處理字符串。以下是一些常用的方法及其簡要描述&#xff1a; 1. **charAt(int index)**&#xff1a;返回指定位置的字符。 2. **length()**&#xff1a;返回字符串的長度。 3. **substring(int beginIndex, int endInd…

微信小程序手勢沖突?不存在的!

原生的應用經常會有頁面嵌套列表&#xff0c;滾動列表能夠改變列表大小&#xff0c;然后還能支持列表內下拉刷新等功能。看了很多的小程序好像都沒有這個功能&#xff0c;難道這個算是原生獨享的嗎&#xff0c;難道是由于手勢沖突無法實現嗎&#xff0c;冷靜的思考了一下&#…

Google驗證碼,掃描綁定,SpringBoot+ vue

文章目錄 后端1.使用Google工具類這個 類的 verifyTest 方法可以判斷掃描綁定之后的app上面驗證碼的準確性。這個類通過g_user,g_code(就是谷歌驗證器的secret,這個你已經插入到數據庫 中)來生成相關二維碼。2.用工具類自帶的g_user,g_code來生成二維碼2.1通過請求來生成相關二…

你知道vector底層是如何實現的嗎?

你知道vector底層是如何實現的嗎&#xff1f; vector底層使用動態數組來存儲元素對象&#xff0c;同時使用size和capacity記錄當前元素的數量和當前動態數組的容量。如果持續的push_back(emplace_back)元素&#xff0c;當size大于capacity時&#xff0c;需要開辟一塊更大的動態…

【InternLM 實戰營筆記】XTuner 大模型單卡低成本微調實戰

XTuner概述 一個大語言模型微調工具箱。由 MMRazor 和 MMDeploy 聯合開發。 支持的開源LLM (2023.11.01) InternLM Llama&#xff0c;Llama2 ChatGLM2&#xff0c;ChatGLM3 Qwen Baichuan&#xff0c;Baichuan2 Zephyr 特色 傻瓜化&#xff1a; 以 配置文件 的形式封裝了大…

WebGIS----wenpack

學習資料&#xff1a;https://webpack.js.org/concepts/ 簡介&#xff1a; Webpack 是一個現代化的 JavaScript 應用程序的模塊打包工具。它能夠將多個 JavaScript 文件和它們的依賴打包成一個單獨的文件&#xff0c;以供在網頁中使用。 Webpack 還具有編譯和轉換其他類型文…

自學新標日第六課(單詞部分 未完結)

第六課 單詞 單詞假名聲調詞義來月らいげつ1下個月先月せんげつ1上個月夜中よなか3午夜昨夜ゆうべ0昨天晚上コンサートこんさーと1音樂會クリスマスくりすます3圣誕季誕生日たんじょうび&#xff13;生日こどもの日こどものひ&#xff15;兒童節夏休みなつやすみ&#xff13;…

看待事物的層與次 | DBA與架構的一次對話交流

前言 在計算機軟件業生涯中,想必行內人或多或少都能感受到系統架構設計與數據庫系統工程的重要性,也能夠清晰地認識到在計算機軟件行業中技術工程師這個職業所需要的專業素養和必備技能! 背景 通過自研的數據庫監控管理工具,發現 SQL Server 數據庫連接數在1-2K之間,想…

Yii2中如何使用scenario場景,使rules按不同運用進行字段驗證

Yii2中如何使用scenario場景&#xff0c;使rules按不同運用進行字段驗證 當創建news新聞form表單時&#xff1a; 添加新聞的時候執行create動作。 必填字段&#xff1a;title-標題&#xff0c;picture-圖片&#xff0c;description-描述。 這時候在model里News.php下rules規則…

星座每日運勢 api接口

接口數據api 接口平臺&#xff1a;https://api.yuanfenju.com/ 開發文檔&#xff1a;https://doc.yuanfenju.com/zhanbu/yunshi.html 支持格式&#xff1a;JSON 請求方式&#xff1a;HTTP POST <?php//您的密鑰 $api_secret "wD******XhOUW******pvr"; //請…

利用coze 搭建“全功能“微信客服(2)

緊跟上篇 利用coze 搭建"全功能"微信客服&#xff08;1&#xff09;&#xff0c;不知道來龍去脈自行查閱 先表揚下coze: coze 是國內少數開放平臺之一&#xff0c;里面提供各種插件還可以開發工作流&#xff0c;讓你可以實現多模態全功能大模型 吐槽 沒有API開放接口…

國外最流行的是AI,國內最流行的是AI培訓教程

國外最流行的是AI&#xff0c;國內最流行的是AI培訓教程。 最近李一舟AI教程事件&#xff0c;驗證了這句話。 如今給客戶做方案項目里能加點AI色彩&#xff0c;立項的成功率都變大(特別是事業單位)。 正因如此&#xff0c;大家都在狂補AI的知識&#xff0c;不然肚子里沒點墨水&…