集合-1 數組ArrayListLinkedList

一.數組

1.什么是數組?

數組是一種用連續的內存空間存儲相同類型數據的線性數據結構。

2.為什么數組下標是從0開始?

(1)數組根據下標查找元素是基于尋址公式:元素地址=數組首地址+索引i*數組存儲數據類型的大小

(2)如果下標從0開始,則尋址公式應改為:元素地址=數組首地址+(i-1)*數組存儲數據類型的大小;對cpu而言多了一個(i-1)的操作,性能下降。

3.數組查找元素的時間復雜度

(1)已知下標:O(1)

(2)未知下標:O(n)

(3)未知下標但排序:根據二分法查找是O(logn)

(4)插入和刪除時,為了保證在內存存儲的連續性,需要數組元素,平均時間復雜度為O(n)

二.ArrayList

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

(1)ArrayList底層是用動態的數組實現的。

(2)ArrayList創建時,若未指定容量,則初始化數組長度為0;第一次添加數據時才將數組長度擴容為10。

(3)后續的每次擴容,都將數組長度擴容為原來的1.5倍;每次擴容都需要將原數組元素拷貝到新數組。

(4)ArrayList在添加數據時:

? ? ? ? a.計算數組當前已存儲容量size,若size+1>length,則調用grow()方法進行擴容(擴容為原來的1.5倍)。

? ? ? ? b.將新添加的數據存儲到數組的size位置上,添加成功返回布爾值

2.ArrayList list = new ArrayList(10);代碼中list擴容了幾次?

(1)ArrayList有三種構造方法:

? ? ? ? a.ArrayList(int initialCapacity):帶初始化容量的構造函數,將數組的容量初始化為initialCapacity;

? ? ? ? b.ArrayList():無參構造函數,數組容量初始化為0,第一次添加元素時才擴容為10;

????????c.ArrayList(Collection<?extends E> c):將c轉化為ArrayList
(2)代碼中是使用了ArrayList的帶初始化容量的構造函數,并未進行擴容。

3.如何實現數組和List之間的轉換?

(1)數組轉List:調用JDK中的工具類Arrays中的asList()方法。

(2)List轉數組:調用List類中的toArray()方法。若toArray()方法不傳參,則返回一個Object數組;若傳入一個已經初始化長度的數組,則將List中的數據存到該數組并返回該數組。

4.通過Arrays.asList()將數組轉List后,若修改數組內容,List會受影響嗎?

(1)asList()的實現原理是通過Arrays類中的一個內部類ArrayList來將數組包裝成一個ArrayList;

(2)asList()方法會將ArrayList中的數組指向傳入的數組,再將ArrayList對象返回,以此來實現將數組轉化成List。

(3)這個指向是一個引用傳遞,ArrayList的數組和傳入的數組指向同一塊地址,因此修改數組內容,List會受影響。

5.ArrayList 和 Arrays類的內部類Arrays.ArrayList的區別

(1)add方法

? ? ? ? a.ArrayList和Arrays.ArrayList都繼承了抽象類AbstractList;

? ? ? ? b.AbstractList中的add()方法默認為若子類未重寫該方法,則使用時會拋出UnsupportedOperationException異常

? ? ? ? c.ArrayList重寫了add()方法,可以有添加元素操作

? ? ? ? d.Arrays.ArrayList未重寫add()方法,無法添加元素

******e.由于Arrays.asList()返回的是Arrays.ArrayList對象,因此通過這種方式將數組轉成的List是無法添加元素的。

(2)構造參數為數組或集合時

? ? ? ? a.ArrayList只能接收Collection

? ? ? ? b.Arrays.ArrayList能接收數組E[]

6.通過List類的toArray()將List轉成數組后,若修改List內容,數組會受影響嗎?

不會受影響,toArray()的實現原理是將List中的數組進行拷貝,并返回一個新數組對象。返回的數組與List中的數組不指向同一塊地址,因此互不影響。

7.ArrayList和LinkedList的區別是什么?

1.底層數據結構

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

(2)LinkedList底層是用雙向鏈表實現的

2.操作數據的效率不同

(1)查

? ? ? ? a.已知索引的情況下,ArrayList根據尋址公式查找,效率是O(1);LnkedList是遍歷查找,效率是O(n)。

? ? ? ? b.未知索引的情況下,ArrayList和LinkedList都是遍歷查找,效率都是O(n)。

(2)增刪

? ? ? ? a.ArrayList進行尾部增刪效率是O(1),其他位置的增刪都需要挪動數組,效率是O(n)。

? ? ? ? b.LinkedList進行頭尾增刪效率是O(1),其他位置的增刪都需要遍歷鏈表,效率是O(n)。

3.內存空間占用

(1)ArrayList底層是數組,在內存中是連續存儲的,節省內存空間。

(2)LinkedList底層是雙向鏈表,在內存中是離散存儲的,還需額外存儲前后兩個節點的地址,更占用內存空間

4.線程安全

ArrayList和LinkedList都是線程不安全的,若要保證線程安全,有兩種方案:

(1)在方法內定義使用,對于局部變量是線程安全的。

(2)使用Collections.synchronizedList(new ArrayList<>())或Collections.synchronizedList(new LinkedList<>())構建線程安全的List,該方法就是創建加了synchronized鎖的List,線程安全但操作性能下降。

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

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

相關文章

ROS | 用C++和python實現運動控制功能

基礎知識&#xff1a; 用C實現&#xff1a; C代碼&#xff1a; 用python實現&#xff1a; Python代碼&#xff1a;

數據庫理論基本概念

數據庫理論基本概念 三級模式和兩級映像 外模式 > 用戶和數據庫系統的接口 -------- 外模式-概念模式映射 概念模式 > 數據的邏輯結構和特征的描述 -------- 概念模式-內模式映射 內模式 > 數據物理結構和存儲方式的描述三級…

避雷:搭建ai知識庫的6大注意事項

隨著人工智能技術的發展&#xff0c;ai知識庫成為眾多企業追求的一個重要部分&#xff0c;幫助企業提高運營次效率&#xff0c;越來越受到人們的關注。但是&#xff0c;在搭建ai知識庫的過程中&#xff0c;稍不留意&#xff0c;就會漏掉一些小細節&#xff0c;導致做出來的ai知…

【LeetCode】438.找到字符串中所有字母異位詞

找到字符串中所有字母異位詞 題目描述&#xff1a; 給定兩個字符串 s 和 p&#xff0c;找到 s 中所有 p 的 異位詞 的子串&#xff0c;返回這些子串的起始索引。不考慮答案輸出的順序。 異位詞 指由相同字母重排列形成的字符串&#xff08;包括相同的字符串&#xff09;。 示…

Scala學習筆記4: 數組

目錄 第四章1- 定長數組2- 變長數組3- 遍歷數組和數組緩存4- 數組轉換5- 常用算法6- 多維數組end 第四章 1- 定長數組 在Scala中, 定長數組可以使用 Array 類來創建; 定長數組在創建時需要指定數組的長度, 并且長度在整個數組生命周期中保持不變; 示例: // 定義一個定長數組…

GPT-4o 引領人機交互新風向的向量數據庫Milvus Cloud 成本

成本 AIGC 時代對于冷熱儲存的呼喚 成本一直是向量數據庫獲得更廣泛使用的最大阻礙之一,這個成本來自兩點: 儲存,絕大多數向量數據庫為了保證低延遲,需要把數據全量緩存到內存或者本地磁盤。在這個動輒百億量級的AI 時代,意味著幾十上百 TB 的資源消耗。 計算,數據需…

OpenFeign高級用法:緩存、QueryMap、MatrixVariable、CollectionFormat優雅地遠程調用

碼到三十五 &#xff1a; 個人主頁 微服務架構中&#xff0c;服務之間的通信變得尤為關鍵。OpenFeign&#xff0c;一個聲明式的Web服務客戶端&#xff0c;使得REST API的調用變得更加簡單和優雅。OpenFeign集成了Ribbon和Hystrix&#xff0c;具有負載均衡和容錯的能力&#xff…

線性回歸模型之套索回歸

概述 本案例是基于之前的嶺回歸的案例的。之前案例的完整代碼如下&#xff1a; import numpy as np import matplotlib.pyplot as plt from sklearn.linear_model import Ridge, LinearRegression from sklearn.datasets import make_regression from sklearn.model_selectio…

NegativePrompt:利用心理學通過負面情緒刺激增強大型語言模型

【摘要】大型語言模型 (LLM) 已成為各種應用不可或缺的一部分&#xff0c;從傳統的計算任務到高級人工智能 (AI) 應用。這種廣泛的應用促使社會科學等各個學科對 LLM 進行了廣泛的研究。值得注意的是&#xff0c;研究表明 LLM 具有情商&#xff0c;可以通過積極的情緒刺激進一步…

C++:深入理解多態

一、多態的概念 多態的概念&#xff1a;通俗來說&#xff0c;就是多種形態&#xff0c;具體點就是去完成某個行為&#xff0c;當不同的對象去完成時會產生出不同的狀態。 那究竟多態的實際價值體現在哪里呢&#xff1f;&#xff1f; 1、舉個例子比如說購買高鐵票這個行為&…

Spring Boot | SpringBoot 中 自定義 “用戶授權管理“ : 自定義“用戶訪問控制“、自定義“用戶登錄控制“

目錄: 一、SpringBoot 中 自定義 "用戶授權管理" ( 總體內容介紹 ) :二、 自定義 "用戶訪問控制" ( 通過 "HttpSecurity類" 的 authorizeRequests( )方法來實現 "自定義用戶訪問控制" ) :1.基礎項目文件準備2.實現 "自定義身份認…

4. 分布式鏈路追蹤客戶端工具包Starter設計

前言 本文將從零搭建分布式鏈路追蹤客戶端工具包的Starter&#xff0c;并將在后續文章中逐步豐富支持的場景。這里首先將搭建一個最基礎的Starter&#xff0c;能提供的功能和1. 看完這篇文章我奶奶都懂Opentracing了一文中的示例demo類似。 相關版本依賴如下。 opentracing-…

Scala學習2: 控制結構和函數

目錄 第二章 控制結構和函數1- 條件表達式2- 語句終止3- 塊表達式和賦值4- 輸入和輸出5- 循環6- 高級for循環和for推到式7- 函數8- 默認參數和帶名參數9- 可變參數10- 過程11- 懶值12- 異常end 第二章 控制結構和函數 1- 條件表達式 Scala的 if/esle 語法結構與java一樣, 但是…

MySQL表突然卡死,刪、查操作加載不停解決辦法

今天遇到了MySQL刪表的時候卡死情況。然后通過網上查閱資料和項目組溝通&#xff0c;了解到了有多人同時對同一張表進行了操作。我和另一個同事同時進行了刪除操作&#xff0c;然后另兩位同時進行了查詢操作&#xff0c;然后還有一位同事用dolphin調度&#xff0c;用datax采集數…

【SQL】SQL常見面試題總結(4)

目錄 1、空值處理1.1、統計有未完成狀態的試卷的未完成數和未完成率1.2、0 級用戶高難度試卷的平均用時和平均得分 2、高級條件語句2.1、篩選限定昵稱成就值活躍日期的用戶&#xff08;較難&#xff09;2.2、篩選昵稱規則和試卷規則的作答記錄&#xff08;較難&#xff09;2.3、…

SmartEDA助力電工基礎實驗:打造高效、智能的學習新體驗

在電工基礎實驗的教學與學習中&#xff0c;傳統的實驗設備往往存在著操作復雜、數據處理繁瑣等問題&#xff0c;給學生的學習帶來了不小的挑戰。然而&#xff0c;隨著科技的不斷發展&#xff0c;一種名為SmartEDA的智能電工實驗輔助設備正逐漸走入課堂&#xff0c;以其高效、智…

Es6-對象新增了哪些擴展?

?&#x1f308;個人主頁&#xff1a;前端青山 &#x1f525;系列專欄&#xff1a;Javascript篇 &#x1f516;人終將被年少不可得之物困其一生 依舊青山,本期給大家帶來Javascript篇專欄內容:Es6-對象新增了哪些擴展&#xff1f; 目錄 一、參數 二、屬性 函數的length屬性 …

Unsupervised Out-of-Distribution Detection with Diffusion Inpainting

Unsupervised Out-of-Distribution Detection with Diffusion Inpainting 摘要1.介紹2 背景3 3. Lift, Map, Detect摘要 無監督的異常分布檢測(OOD)旨在通過僅從未標記的域內數據中學習來識別域外數據。我們提出了一種用于此任務的新方法——提升、映射、檢測(LMD),該方法…

數據結構-棧(帶圖)

目錄 棧的概念 畫圖理解棧 棧的實現 fun.h fun.c main.c 棧的概念 棧&#xff08;Stack&#xff09;是一種基本的數據結構&#xff0c;其特點是只允許在同一端進行插入和刪除操作&#xff0c;這一端被稱為棧頂。遵循后進先出&#xff08;Last In, First Out, LIFO&#…

瀏覽器下載附件流建議

大文件下載可采用附件流的方式&#xff0c;后端設置一下響應參數&#xff0c;然后以流的方式返回前端 res.set({ "Content-Type": "application/octet-stream", "Content-Disposition": "attachment;filename* UTF-8"fixedEncodeUR…