Java數據結構——ArrayList

Java中ArrayList

  • 一 ArrayList的簡介
  • 二 ArrayList的構造方法
  • 三 ArrayList常用方法
    • 1.add()方法
    • 2.remove()方法
    • 3.get()和set()方法
    • 4.index()方法
    • 5.subList截取方法
  • 四 ArrayList的遍歷
    • for循環遍歷
    • 增強for循環(for each)
    • 迭代器遍歷
  • ArrayList問題及其思考

前言
ArrayList是一種 順序表,??段 物理地址連續的存儲單元依次存儲數據的線性結構,一般情況都是采用數組存儲,在數組上實現一些增刪查改等等功能, ArrayList是Java中最常用的 動態數組實現之一,其內部的內存空間是可以改變的,今天就來探究一下ArrayList使用及其原理

在這里插入圖片描述

一 ArrayList的簡介

ArrayList雖然是一個普通的類,但是它實現了List接口

List接口在JDK17的部分源碼
在這里插入圖片描述
ArrayList類在JDK17的部分源碼
在這里插入圖片描述
我們可以從上面看出

1. List是一個接口,繼承了Collection2. ArrayList是一個類,繼承了AbstractList3. ArrayList實現了List中的RandomAccess接口,說明其支持隨機訪問
4. 實現了Cloneable接口,說明其支持clone
5. 實現了Serializable接口,說明其支持序列化 

下面是ArrayList的一些常用方法,因為其實現了List接口,所以List中的抽象方法,在ArrayList都有
在這里插入圖片描述

二 ArrayList的構造方法

ArrayList ()無參構造
ArrayList (int initialCapacity)確定初始容量
ArrayList (Collection<? extends E> c)利用其他Collection來構造
public class Test {public static void main(String[] args) {//1.無參構造List<Integer> list = new ArrayList<>();//2.含參構造,確定其初始化的容量,確定其初始化容量為1List<Integer> list1 = new ArrayList<>(1);//3.利用其他構造//這里list2與list的元素一致List<Integer> list2 = new ArrayList<>(list);}
}

無參構造源碼
在這里插入圖片描述
在這里插入圖片描述
雖然無參構造沒有給定容量,但是編譯器會默認一個容量,JDK17中默認容量為10

含初始容量一個參數的構造
在這里插入圖片描述
如果給定初始容量,編譯器會進行判斷,如果初始容量>0就按照你給定的容量創建對象,如果初始容量==0就按照默認的容量進行創建,反之如果<0就拋出容量不合法的異常

注意在創建線性表的時候,要指定是什么類型的線性表
1.如果不寫類型,編譯器會報錯,因為其不知道是什么類型
在這里插入圖片描述
2.并且其必須是包裝類型
如果寫成普通類型編譯器也會報錯
在這里插入圖片描述
3.那何為包裝類型呢

基本數據類型包裝類
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble
charCharacter
booleanBoolean

這些類型中除了int和char的包裝類有所改變,其他的都是基本類型的首字母大寫

三 ArrayList常用方法

方法解釋
boolean add(E e)尾插 e
void add(int index, E e)將 e插入到 index 位置
boolean addAll(Collection<? extends E> c)尾插 c 中的全部元素
E remove(int index)刪除 index 下標元素
boolean remove(Object o)刪除遇到的第一個 o
E get(int index)獲取下標 index 下標元素
E set(int index, E e)將下標 index 下標元素設置為 e
void clear()清空列表
boolean contains(Object o)判斷 o 是否在線性表中
int indexOf(Object o)返回第一個 o 所在下標
int lastIndexOf(Object o)返回最后一個 o 的下標
List subList(int fromIndex, int toIndex)截取部分 list
int size()返回此列表中的實際的元素數

1.add()方法

boolean add(E e)
將指定的元素追加到此列表的末尾。

public class Test {public static void main(String[] args) {List<Integer> list = new ArrayList<>();list.add(1);list.add(2);list.add(3);System.out.println(list);}
}

運行結果如下
在這里插入圖片描述

注意這里的如果已經確定了是那種包裝類型,就不可以在添加其他的包裝類型的數據了
在這里插入圖片描述

public class Test {public static void main(String[] args) {List<Integer> list = new ArrayList<>(3);list.add(1);list.add(2);list.add(3);System.out.println("擴容前長度"+list.size());list.add(4);System.out.println("擴容后長度"+list.size());System.out.println(list);}
}

運行結果如下
在這里插入圖片描述
我們發現一個問題就是上面我們初始化容量為3,但是我們添加了4個元素其并沒有報錯,為什么呢?那是因為其ArrayList類add方法中有擴容操作,但是這里的真實長度變為4
在這里插入圖片描述

void add(int index, E e)
在index下標插入e
index>=0&&index<=其列表的長度

public class Test {public static void main(String[] args) {List<Integer> list = new ArrayList<>();list.add(1);list.add(2);list.add(3);//在1下標插入99list.add(1,99);// list.add(4,1);System.out.println(list);}
}

我們要注意這里并不是簡單替換,而是將某一個下標修改為一個數后,原本的數要往后偏移
偏移的同時其如果存儲不下,也會進行擴容

運行結果如下
在這里插入圖片描述
注意這里的下標要合法 index下標>=0&&index<=list.size()
這里等于其list的容量也可以,因為這樣正好就相當于上面一個參數的add進行尾插
在這里插入圖片描述
如果大于list.size()就會出現數組越界異常
這里長度為3,這里index>=0&&index<=3,因此這里出現數組越界異常異常了
在這里插入圖片描述

boolean addAll(Collection<? extends E> c)
將指定集合中的所有元素追加到此列表的末尾
這里是可以自己尾插自己的

public class Test {public static void main(String[] args) {List<Integer> list = new ArrayList<>();list.add(1);list.add(2);list.add(3);System.out.println("尾插前list"+list);List<Integer> list1 = new ArrayList<>();list1.add(10);list1.add(20);list1.add(30);//將list1尾插到list后面list.addAll(list1);System.out.println("尾插后list"+list);}
}

在這里插入圖片描述
這里其實也是可以自己尾插自己的
下面這個自己尾插自己成功了
在這里插入圖片描述
注意這里是不可以不同類型的列表進行尾插
一個列表中不可以放兩種包裝類型一樣,尾插不同類型的肯定會報錯
在這里插入圖片描述

2.remove()方法

E remove(int index)
刪除 index 下標元素
index>=0&&index<列表長度

public class Test {public static void main(String[] args) {List<Integer> list = new ArrayList<>();list.add(1);list.add(2);list.add(3);//刪除1下標的值list.remove(1);System.out.println(list);}
}

這里刪除1下標的值,也就是刪除這里的2
運行結果如下
在這里插入圖片描述

boolean remove(Object o)
刪除遇到的第一個 o
在使用的時候要將一個數裝箱以后再進行刪除

這里直接使用基本類型就是刪除的是對應下標的值,而不是自己想要的

在這里插入圖片描述
這時候就要進行裝箱操作,這樣就可以刪除對應的值了,刪除的就不是下標對應的值了
這里就是刪除第一個出現的1元素,而不是下標,所以這里0下標的1被刪除了
在這里插入圖片描述

void clear()
清空列表

public class Test {public static void main(String[] args) {List<Integer> list = new ArrayList<>();list.add(1);list.add(2);list.add(3);//刪除1下標的值Integer a = 1;list.remove(a);System.out.println(list);list.clear();System.out.println("清空后"+list);}
}

這里就是將其置為空
在這里插入圖片描述

3.get()和set()方法

E get(int index)
獲取下標 index 下標元素

E set(int index, E e)
將下標 index 下標元素設置為 e
index>=0&&index<列表長度

public class Test {public static void main(String[] args) {List<Integer> list = new ArrayList<>();list.add(1);list.add(2);list.add(3);System.out.println("獲取1下標的值:"+list.get(1));list.set(1,999);System.out.println("修改后1下標的值:"+list.get(1));}
}

這里和add方法不同的是,這個是直接修改值,而add是添加值
運行結果如下
在這里插入圖片描述

4.index()方法

int indexOf(Object o) 返回第一個 o 所在下標
int lastIndexOf(Object o) 返回最后一個 o 的下標
找不到就返回-1

public class Test {public static void main(String[] args) {List<Integer> list = new ArrayList<>();list.add(1);list.add(2);list.add(3);list.add(1);System.out.println("第一個元素1的下標:"+list.indexOf(1));//0//如果沒有找到就返回-1System.out.println(list.indexOf(100));//-1System.out.println("最后一個元素1的下標:"+list.lastIndexOf(1));}
}

在這里插入圖片描述

5.subList截取方法

List subList(int fromIndex, int toIndex)
截取下標[fromIndex,toIndex]的list

public class Test {public static void main(String[] args) {List<Integer> list = new ArrayList<>();list.add(1);list.add(2);list.add(3);list.add(4);list.add(5);List<Integer> list1 = list.subList(1,3);//這里是左閉右開的截取方法System.out.println("截取[1,3)下標的元素:"+list1);}
}

運行結果如下
在這里插入圖片描述
其實這里并不是真正的截取
例如:

public class Test {public static void main(String[] args) {List<Integer> list = new ArrayList<>();list.add(1);list.add(2);list.add(3);list.add(4);list.add(5);List<Integer> list1 = list.subList(1,3);//這里是左閉右開的截取方法System.out.println("截取[1,3)下標的元素:"+list1);list1.remove(0);//刪除list1中的0下標的值也就是2System.out.println("被截取的list: "+ list);}
}

這里刪除截取中0下標的2,而原本的list中的2也被刪除了
運行結果如下
在這里插入圖片描述
可以看出這里我們對截取的內容刪除,導致了list中的這部分內容也被刪除了
在這里插入圖片描述

只是將其一個對象指向截取的部分,只是將其截取部分的地址放入一個新對象中,因此對截取修改也會影響原本的list

四 ArrayList的遍歷

for循環遍歷

public class Test {public static void main(String[] args) {List<Integer> list = new ArrayList<>();list.add(1);list.add(2);list.add(3);list.add(4);list.add(5);for (int i = 0; i < list.size(); i++) {//獲取下標對應的值System.out.print(list.get(i)+" ");}}
}

這里的size()獲取其列表長度
進行一個一個下標遍歷就行
運行結果如下
在這里插入圖片描述

增強for循環(for each)

public class Test {public static void main(String[] args) {List<Integer> list = new ArrayList<>();list.add(1);list.add(2);list.add(3);list.add(4);list.add(5);//每個元素的類型為Integerfor (Integer integer:list) {System.out.print(integer+" ");}}
}

這里使用for-each遍歷,這里列表中元素類型都為Integer,就用一個臨時integer來訪問和打印
在這里插入圖片描述

迭代器遍歷

public class Test {public static void main(String[] args) {List<Integer> list = new ArrayList<>();list.add(1);list.add(2);list.add(3);list.add(4);list.add(5);//使用迭代器//從前向后遍歷Iterator<Integer> it = list.iterator();//獲取其開始位置while(it.hasNext()){//不斷的往后走System.out.print(it.next()+" ");}System.out.println();//從后向前遍歷給定其下標從其最后面開始ListIterator<Integer> it1 = list.listIterator(list.size());while (it1.hasPrevious()){System.out.print(it1.previous()+" ");}System.out.println();}
}

運行結果如下
在這里插入圖片描述

ArrayList問題及其思考

1.在其查找數據是非常簡單和高效的
2.但是,ArrayList列表在添加或者刪除元素的時候,都需要將其后面的數據向前移動,時間復雜度為O(N)
3.在添加數據時候可能會擴容,是1.5倍數擴容,有點浪費空間

因此還需要其他的數據結構來完成添加或者刪除元素會更高效一點

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

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

相關文章

【信息獲取能力】

第一層&#xff1a;表象觀察 現象&#xff1a;AI系統&#xff08;如GPT-4&#xff09;可以瞬間調用并整合全球互聯網上的公開信息&#xff0c;而人類即使窮盡一生也無法完成同等規模的知識儲備。 底層邏輯&#xff1a; 存儲與檢索效率&#xff1a;人類大腦的記憶容量有限&…

03、GPIO外設(三):標準庫代碼示例

標準庫代碼示例 1、點亮LED2、LED閃爍3、LED流水燈4、按鍵控制LED5、蜂鳴器 本章源代碼鏈接&#xff1a; 鏈接: link 1、點亮LED 實驗要求&#xff1a;點亮LED ①LED.c文件的代碼如下: #include "LED.h"/*** LED引腳初始化*//* 定義數組&#xff0c;想要添加引腳…

卷積神經網絡(CNN)與VGG16在圖像識別中的實驗設計與思路

卷積神經網絡&#xff08;CNN&#xff09;與VGG16在圖像識別中的實驗設計與思路 以下從基礎原理、VGG16架構解析、實驗設計步驟三個層面展開說明&#xff0c;結合代碼示例與關鍵參數設置&#xff0c;幫助理解其應用邏輯。 一、CNN與VGG16的核心差異 基礎CNN結構 通常包含33~55個…

java導出word含表格并且帶圖片

背景 我們需要通過 Java 動態導出 Word 文檔&#xff0c;基于預定義的 模板文件&#xff08;如 .docx 格式&#xff09;。模板中包含 表格&#xff0c;程序需要完成以下操作&#xff1a; 替換模板中的文本&#xff08;如占位符 ${設備類型} 等&#xff09;。 替換模板中的圖…

Oracle19C低版本一天遭遇兩BUG(ORA-04031/ORA-600)

昨天幫朋友看一個系統異常卡頓的案例&#xff0c;在這里分享給大家 環境&#xff1a;Exadata X8M 數據庫版本19.11 1.系統報錯信息 表象為系統卡頓&#xff0c;頁面無法刷出&#xff0c;登陸到主機上看到節點1 系統等待存在大量的 cursor: pin S wait on X等待 查看兩個節…

2025年Q1數據安全政策、規范、標準以及報告匯總共92份(附下載)

一、政策演進趨勢分析 &#xff08;一&#xff09;國家級政策新動向 數據要素市場建設 數據流通安全治理方案&#xff08;重點解析數據確權與交易規則&#xff09; 公共數據授權運營規范&#xff08;創新性提出分級授權機制&#xff09; 新興技術安全規范 人工智能安全標準…

ERR_PNPM_DLX_NO_BIN No binaries found in tailwindcss

場景復現&#xff1a; 最近在vue3項目中安裝了tailwindcss&#xff0c;但是它默認幫我安裝的版本是4XX的&#xff0c;導致我執行 npx tailwindcss init -p報錯了。 解決方案&#xff1a; 更改tailwindcss的版本為3 pnpm add -D tailwindcss3再次執行生成tailwindcss的初始…

第 4 篇:Motion 拖拽與手勢動畫(交互篇)—— 打造直覺化交互體驗

Framer Motion 的拖拽與手勢系統讓實現復雜交互變得異常簡單。本文將深入解析核心 API&#xff0c;并通過實戰案例演示如何創造自然流暢的交互體驗。 &#x1f9f2; 拖拽動畫基礎 1. 啟用拖拽 使用 drag 屬性即可開啟拖拽能力。支持的值有&#xff1a;true&#xff08;全方向…

CF148D Bag of mice

題目傳送門 思路 狀態設計 設 d p i , j dp_{i, j} dpi,j? 表示袋中有 i i i 個白鼠和 j j j 個黑鼠時&#xff0c; A A A 能贏的概率。 狀態轉移 現在考慮抓鼠情況&#xff1a; A A A 抓到白鼠&#xff1a;直接判 A A A 贏&#xff0c;概率是 i i j \frac{i}{i j}…

BT1120 BT656驅動相關代碼示例

前些年做視頻輸出項目的時候用過bt1120 tx與rx模塊&#xff0c;現將部分代碼進行記錄整理。代碼功能正常&#xff0c;可正常應用。 1. rx部分&#xff1a; /****************************************************************************** Copyright (C) 2021,All rights …

服務器簡介(含硬件外觀接口介紹)

服務器&#xff08;Server&#xff09;是指提供資源、服務、數據或應用程序的計算機系統或設備。它通常比普通的個人計算機更強大、更可靠&#xff0c;能夠長時間無間斷運行&#xff0c;支持多個用戶或客戶端的請求。簡單來說&#xff0c;服務器就是專門用來存儲、管理和提供數…

SQL-exists和in核心區別?、 性能對比?、適用場景?

EXISTS和IN的基本區別。IN用于檢查某個值是否在子查詢返回的結果集中,而EXISTS用于檢查子 查詢是否至少返回了一行數據。通常來說,EXISTS在子查詢結果集較大時表現更好,因為一旦找 到匹配項就會停止搜索,而IN則需要遍歷整個結果集。 在 SQL 中,EXISTS 和 IN 都可以用于…

煥活身心,解鎖健康養生新方式

健康養生是一門科學&#xff0c;更是一種生活智慧。從日常點滴做起&#xff0c;才能筑牢健康根基。? 飲食上&#xff0c;應遵循 “食物多樣&#xff0c;谷類為主” 原則。多攝入新鮮蔬果&#xff0c;它們富含維生素與膳食纖維&#xff0c;有助于增強免疫力&#xff1b;選擇全…

QT+Cmake+mingw32-make編譯64位的zlib-1.3.1源碼成功過程

由于開源的軟件zlib庫是很多相關庫libpng等基礎庫&#xff0c;因此掌握使用mingw編譯器來編譯zlib源碼的步驟十分重要。本文主要是通過圖文模式講解完整的qtcmakezlib源碼搭建和測試過程&#xff0c;為后續的其他源碼編譯環境搭建做基礎準備。 詳細步驟如下&#xff1a; 1、下…

健身會員管理系統(ssh+jsp+mysql8.x)含運行文檔

健身會員管理系統(sshjspmysql8.x) 對健身房的健身器材、會員、教練、辦卡、會員健身情況進行管理&#xff0c;可根據會員號或器材進行搜索&#xff0c;查看會員健身情況或器材使用情況。

【langchain4j】Springboot如何接入大模型以及實戰開發-AI問答助手(一)

langchain4j介紹 官網地址&#xff1a;https://docs.langchain4j.dev/get-started langchain4j可以說是java和spring的關系&#xff0c;spring讓我們開發java應用非常簡單&#xff0c;那么langchain4j對應的就是java開發ai的 “Spring” 他集成了AI應用的多種場景&#xff0c…

平均池化(Average Pooling)

1. 定義與作用?? ??平均池化??是一種下采樣操作&#xff0c;通過對輸入區域的數值取??平均值??來壓縮數據空間維度。其核心作用包括&#xff1a; ??降低計算量??&#xff1a;減少特征圖尺寸&#xff0c;提升模型效率。??保留整體特征??&#xff1a;平滑局部…

【dify實戰】chatflow結合deepseek實現基于自然語言的數據庫問答、Echarts可視化展示、Excel報表下載

dify結合deepseek實現基于自然語言的數據庫問答、Echarts可視化展示、Excel報表下載 觀看視頻&#xff0c;您將學會 在dify下如何快速的構建一個chatflow&#xff0c;來完成數據分析工作&#xff1b;如何在AI的回復中展示可視化的圖表&#xff1b;如何在AI 的回復中加入Excel報…

加一:從簡單問題到復雜邊界的深度思考

加一&#xff1a;從簡單問題到復雜邊界的深度思考 引言 在算法世界里&#xff0c;有些問題看似簡單&#xff0c;實則暗藏玄機&#xff0c;其中“加一”問題就是一個典型例子。所謂“加一”&#xff0c;通常指的是給一個由數字組成的數組表示的整數加一&#xff0c;這聽起來簡…

PointCore——利用局部全局特征的高效無監督點云異常檢測器論文與算法解讀

概述 三維點云異常檢測旨在從訓練集中檢測出異常數據點&#xff0c;是工業檢測、自動駕駛等眾多應用的基礎。然而&#xff0c;現有的點云異常檢測方法通常采用多個特征存儲庫來充分保留局部和全局特征表示&#xff0c;這帶來了高昂的計算成本以及特征之間的不匹配問題。為解決…