數據結構(Java):順序表集合類ArrayList

1、線性表

線性表,在邏輯結構上是連續的(可理解為連續的一條直線,一對一的關系),而在物理結構上不一定連續,通常以數組和鏈式結構進行存儲。

線性表是一種在實際中廣泛使用的數據結構,常見的線性表有:順序表、鏈表、棧、隊列......

2、順序表

順序表是線性表的一種,其物理地址是連續的,采用數組的的存儲結構,在數組上完成數據的增刪查改。

3、集合類ArrayList

在Java集合框架中,ArrayList是一個泛型類,并且實現了List接口,是Java為我們封裝好的順序表。

當我們想存儲哪種類型的元素時,都可以通過泛型傳參來構建相應類型的順序表

接下來,讓我為大家仔細講解一下ArrayList這個集合類。

3.1 ArrayList的成員變量

我們通過觀察ArrayList的源碼,得到其成員變量如下:

已知,DEFAULT_CAPACITY是指默認容量(10),elementData是用來實際存儲數據的數組,size記錄順序表數據的數量,剩下的兩個數組均為空數組。

想要知道他們的用途,我們還需要觀察ArrayList的構造方法。

3.2 ArrayList的構造方法

通過觀察源碼,我們依然可以得出其構造方法:

接下來,我們逐個分析。

3.2.1 帶參構造之public ArrayList(int initialCapacity)

不難看出,我們傳入的參數就是我們初始化順序表時的容量(即大小)。

通過if-else語句可以看出:

1.傳入的參數為正數時,初始化的大小即為參數值。

2.傳入的參數為0時,該順序表數組的引用指向的就是成員變量中的空數組。

3.傳入的參數為負數時,則會拋出異常(數組大小肯定為正數)。

public static void main(String[] args) {ArrayList<Integer> list = new ArrayList<>(10);//初始容量為10}

3.2.2 無參構造之public ArrayList()

這個構造方法就更簡單了,無參構造時,該順序表數組的引用指向的也是成員變量中的空數組。

public static void main(String[] args) {ArrayList<Integer> list = new ArrayList<>();}

3.2.1 帶參構造之public ArrayList(Collection<? extends E> c)

大家看到這個構造方法時,是不是愣住了一下子,哈哈哈~,不要慌張,聽我道來。

我們先來看這個參數CollectionCollection是一個接口,不知道大家是否還有印象,它曾出現在集合框架中的頂層:

而<>中的內容,"?"是指通配符(這里了解即可),extends我們在講解泛型時就已經知道,這規定了通配符的上界為E。

也就是說,該構造方法所傳參數必須滿足以下幾點:

1.實現了Collection接口

2.所具備的泛型必須是E或者E的子類

也就說,我們也可以將另一個順序表當做這個順序表構造方法的參數傳入。

代碼示例:

public static void main(String[] args) {ArrayList<Integer> list = new ArrayList<>();list.add(1);list.add(2);list.add(3);ArrayList<Integer> list1 = new ArrayList<>(list);//將list當做順序表構造方法的參數傳入list1.add(99);list1.add(100);System.out.println(list1);//[1, 2, 3, 99, 100]}

3.3?ArrayList的擴容機制

在上面講順序表的構造方法時,我們講當構造方法為無參構造或者傳入的參數為零時,數組是空數組。既然是空數組,那么我們如何進行數據的添加或者插入呢?以及當數組容量滿時,如何進行數據的添加或者插入呢?

實際上,當無參構造或者傳入的參數為零時,經過源碼的處理,也是將數組的初始容量設置成了DEFAULT_CAPACITY(10)。

且,ArrayList是一個動態順序表,即:在插入元素的過程中會以1.5倍自動擴容(調用Arrays的copyOf方法進行擴容)。

3.4?ArrayList的常用方法

ArrayList提供了很多的方法,在這里,我將列舉較常用的方法。

3.4.1 add方法(數據插入)

該方法實現了重載,分別在順序表尾部插入和在指定下標位置插入。

3.4.1.1 尾部插入數據

方法格式:

代碼示例:

3.4.1.2?指定位置插入數據

方法格式:

代碼示例:

3.4.2?addAll方法

方法格式:

同樣的道理,傳入的參數必須實現了Collection接口,并且其泛型參數的上界為E(上文已經進行了講解)。

調用該方法,可以將參數的數據尾插到當前順序表當中。

代碼演示:

3.4.3?remove方法(數據刪除)

3.4.3.1 刪除指定下標數據

方法格式:

注意:該方法的返回值,為所刪除的數據。

3.4.3.2?刪除確定數值的數據

方法格式:

因為ArrayList是一個泛型類,數組中的元素都為一個對象,所以我們應該傳入相應類型的對象作為參數。

代碼示例:

注意:我們看到,remove方法中的參數被劃上了橫線,這說明該方法的這種傳參調用方式被廢棄了(不常用了),但是我們仍然可以使用。

3.4.4?get方法(獲取數據)

方法格式:

傳入下標,返回指定下標的數據。

3.4.5?set方法(修改數據)

方法格式:

修改指定下標的數據。、

3.4.6?set方法(清空順序表)

方法格式:

?

該方法的底層就是:將有效數據修改為null(各元素為引用類型),再將size(數組大小)置為0。

3.4.7 subList方法(截取順序表)

方法格式:

該方法能夠截取順序表的指定區間(區間為左閉右開),并返回截取后的順序表(注意:返回類型為List,是ArrayList實現的一個接口)。

代碼示例:

需要注意的,新截取的順序表list1和原來的順序表list,指向的的是同一塊空間:

也就是說,修改順序表list1中的數據,list中的數據也會被修改。

3.5 ArrayList的遍歷

3.5.1 for循環遍歷

代碼示例:

public static void main(String[] args) {ArrayList<Integer> list = new ArrayList<>();list.add(1);list.add(2);list.add(3);int size = list.size();for (int i = 0; i < size; i++) {int data = list.get(i);//得到i下標的元素System.out.print(data+" ");}System.out.println();}

3.5.2?for-each循環遍歷

因為順序表實際上是個數組,我們可以通過for-each循環來遍歷順序表:

public static void main(String[] args) {ArrayList<Integer> list = new ArrayList<>();list.add(1);list.add(2);list.add(3);for (int data : list) {System.out.print(data+" ");}}

3.5.3?迭代器遍歷

3.5.3.1?Iterator迭代器

在ArrayList中,存在iterator方法:

通過調用這個方法,我們可以得到一個迭代器對象,再通過這個對象將數據一個一個打印,直到全部打印完成。

public static void main(String[] args) {ArrayList<Integer> list = new ArrayList<>();list.add(1);list.add(2);list.add(3);Iterator<Integer> iterator =  list.iterator();while (iterator.hasNext()) {//hasNext方法 用來判斷是否有下一個數據int data = iterator.next();//next方法是 得到下一個數據System.out.print(data+" ");}}

hasNext方法 用來判斷是否有下一個數據。

next方法是 得到下一個數據。

3.5.3.2?ListIterator迭代器

與Iterator迭代器用法相同,我們可以通過listIterator來遍歷順序表:

public static void main(String[] args) {ArrayList<Integer> list = new ArrayList<>();list.add(1);list.add(2);list.add(3);ListIterator<Integer> listIterator = list.listIterator();while (listIterator.hasNext()) {int data = listIterator.next();System.out.print(data+" ");}}
3.5.3.3? Iterator迭代器和ListIterator迭代器的關系

首先,這兩者均為接口

其次,我們通過源碼可以發現,ListIterator拓展了Iterator,也就是說,ListIterator迭代器拓展了Iterator迭代器的功能,其方法更加豐富。

3.5.3.3.1?ListIterator迭代器的新增功能

這里,我們演示一個ListIterator的新增方法。

通過源碼,我們可以發現ArrayList的listIterator方法可以傳入參數,

調用listIterator方法并傳入參數,得到的迭代器就會來到該下標的元素之后的位置,

我們再使用ListIterator新增的hasPrevious和previous方法就可以實現對順序表從后往前的遍歷:

代碼:

public static void main(String[] args) {ArrayList<Integer> list = new ArrayList<>();list.add(1);list.add(2);list.add(3);int size = list.size();ListIterator<Integer> listIterator = list.listIterator(size);while (listIterator.hasPrevious()) {int data = listIterator.previous();System.out.print(data+" ");}}

OK~本次博客到這里就結束了,

感謝大家的閱讀~歡迎大家在評論區交流問題~

如果博客出現錯誤可以提在評論區~

創作不易,請大家多多支持~

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

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

相關文章

Vue介紹與入門(一篇入門)

Vue.js 是一個流行的 JavaScript 框架&#xff0c;專門用于構建用戶界面和單頁面應用程序。它簡單易學&#xff0c;但功能強大&#xff0c;能夠幫助開發者快速構建交互性強的 Web 應用。 本教程旨在幫助那些剛開始學習 Vue.js 的開發者快速入門&#xff0c;并掌握一些基礎知識…

【UE5.1 角色練習】12-坐騎——Part2(讓角色騎上坐騎)

目錄 前言 效果 步驟 一、坐騎的父類 二、將角色附加到坐騎 三、添加坐姿 四、騎上坐騎 五、從坐騎上下來 前言 在上一篇&#xff08;【UE5.1 角色練習】11-坐騎——Part1&#xff08;控制大象移動&#xff09;&#xff09;基礎上繼續實現角色騎上坐騎的功能。 效果 …

語言的數據結構:樹與二叉樹(二叉樹篇)

語言的數據結構&#xff1a;樹與二叉樹&#xff08;二叉樹篇&#xff09; 前言概念特別的二叉樹滿二叉樹完全二叉樹 存儲結構順序存儲鏈式存儲 查找方式 前言 上文說到了樹&#xff0c;有人認為二叉樹是樹的每一個分支都有兩個子節點。其實這也對。但二叉樹在此基礎上還做了限…

RS422串口通信協議介紹和基礎代碼實現

**RS-422串口協議介紹**RS-422是一種工業標準的通信接口&#xff0c;其全稱是“平衡電壓數字接口電路的電氣特性”。它是在RS-232的基礎上發展而來&#xff0c;旨在解決RS-232通信距離短和速率低的缺點。以下是對RS-422串口協議的詳細介紹&#xff1a;傳輸速率與距離&#xff1…

MyCAT 2 簡單入門

MyCAT 2 基礎 什么是 MyCAT 2&#xff1f; MyCAT 2 是一款開源的數據庫中間件&#xff0c;它主要用于解決數據庫的分庫分表、讀寫分離等問題。MyCAT 2 基于 MyCAT 1 的架構進行優化和重構&#xff0c;具有更高的性能和穩定性&#xff0c;支持多種數據庫類型&#xff0c;包括 …

【QCustomPlot實戰系列】QCPGraph區域高亮

使用QCPDataSelection來設置選中的區域&#xff0c;并將QCPGraph的可選擇區域設置成QCP::stMultipleDataRanges void AreaPieces::initCustomPlot(QCustomPlot *parentPlot) {QVector<double> x {0, 1, 2, 3, 4, 5, 6, 7, 8};QVector<double> y {200, 560, 750…

《mysql篇》--mysql常用命令

數據庫操作 顯示當前數據庫 show databases;(database 后面要加s) 這行命令用來顯示當前有多少個數據庫 //mysql中有自帶的四個庫 創建數據庫 create database 數據庫名(name); 創建一個數據庫 create dabase if not exists <數據庫名(name)>; //如果系統有與當前創建…

前端vite+vue3——利用環境變量和路由區分h5、pc模塊打包(從0到1)

?前言 大家好&#xff0c;我是yma16&#xff0c;本文分享 前端vitevue3——利用環境變量和路由對前端區分h5和pc模塊打包&#xff08;從0到1&#xff09;。 背景&#xff1a; 前端本地開發pc和h5的項目&#xff0c;發布時需要區分開h5和pc的頁面 vite Vite 通過在一開始將應…

圖片怎么加水印?快來試試這6個圖片加水印方法(2024年新)

圖片怎么加水印&#xff1f;作為打工人在日常的工作生活中總會遇到各種各樣的工作難題&#xff0c;相信從事電商或者是設計等工作的小伙伴們&#xff0c;遇到最多的問題應該就是給圖片添加水印了。為什么要給圖片加水印&#xff1f;其實給圖片加水印最主要的目的是保護我們的圖…

刷題——二叉樹的中序遍歷

雙指針法 void midorder(vector<int>&res, TreeNode* root){if(root NULL) return;midorder(res, root->left);res.push_back(root->val);midorder(res, root->right);}vector<int> inorderTraversal(TreeNode* root) {// write code herevector<…

代碼隨想錄算法訓練營第四十九天|LeetCode300 最長遞增子序列、LeetCode674 最長連續遞增序列、LeetCode718 最長重復子數組

題1&#xff1a; 指路&#xff1a;300. 最長遞增子序列 - 力扣&#xff08;LeetCode&#xff09; 思路與代碼&#xff1a; 求最長遞增子序列&#xff0c;那么就定義一個數組dp[i]&#xff0c;含義為最長遞增子序列。這里有一個小問題&#xff0c;這里的序列的范圍為何。如果…

一文入門Makefile

今天我們來玩玩Makefile。 這邊是借鑒的陳皓老師的《跟我一起寫 Makefile》 pdf下載鏈接如下。 鏈接&#xff1a;https://pan.baidu.com/s/1woRq2nEkgzLv1o5uE0FZHg?pwdmhrh 提取碼&#xff1a;mhrh 我們之前已經算是入門了gcc&#xff0c;那我們的下一站就是Makefile&…

http和https請求總結

http請求是不安全的請求的端口是80&#xff0c;https請求是安全的請求的端口是443 但是請求安全也不是絕對的。 要想先了解https就的先說幾個概念 1、證書 2、加密算法 openssl TLS/SSL 3、協議x509協議 http傳輸數據都是明文&#xff0c;在數據傳輸的過程會經過很長的鏈路…

C#面: 能夠將非靜態的方法覆寫成靜態方法嗎?

在C#中&#xff0c;不能將非靜態方法覆寫成靜態方法。這是因為靜態方法是屬于類的&#xff0c;而非靜態方法是屬于類的實例的。覆寫&#xff08;重寫&#xff09;是指在派生類中重新實現基類中的虛方法或抽象方法&#xff0c;以改變其行為。而靜態方法是無法被派生類所繼承的&a…

嵌入式學習(Day 51:ARM指令/匯編與c語言函數相互調用)

1.Supervisor模式與SVC模式 Supervisor模式是ARM處理器的一個特權工作模式&#xff0c;允許執行特權指令和訪問特權資源。SVC模式&#xff08;Supervisor Call&#xff09;是與Supervisor模式相關的一個功能或指令&#xff0c;用于從用戶模式切換到Supervisor模式&#xff0c;…

1、Redis系列-Redis高性能原理詳解

Redis高性能原理詳解 Redis是一款高性能的內存數據庫&#xff0c;廣泛應用于需要快速讀寫訪問的數據密集型應用中。它的高性能得益于多方面的設計和優化。以下是Redis高性能實現的詳細解釋&#xff1a; 1. 單線程架構 Redis采用單線程架構來處理客戶端請求&#xff0c;這與傳…

服務器流量收發測試-續篇

文章目錄 一、概述二、普通java工程1&#xff0c;pom文件2&#xff0c; 定時任務3&#xff0c;打包4&#xff0c;jar運行 三、打包docker鏡像1&#xff0c;鏡像打包配置docker環境&#xff1a;2&#xff0c;連接遠程鏡像倉庫 四、部署運行1. 容器運行2. 單容器多次運行jar3. 容…

大模型應用研發基礎環境配置(Miniconda、Python、Jupyter Lab、Ollama等)

老牛同學之前使用的MacBook Pro電腦配置有點舊&#xff08;2015 年生產&#xff09;&#xff0c;跑大模型感覺有點吃力&#xff0c;操作起來有點卡頓&#xff0c;因此不得已撿起了塵封了快兩年的MateBook Pro電腦&#xff08;老牛同學其實不太喜歡用 Windows 電腦做研發工作&am…

04_記錄鎖

記錄鎖&#xff08;Record Lock&#xff09; 文章目錄 記錄鎖&#xff08;Record Lock&#xff09;簡介原理加鎖流程鎖類型使用場景示例與其他鎖的對比結論 簡介 MySQL 中的記錄鎖&#xff08;Record Lock&#xff09;是行級鎖的一種&#xff0c;用于鎖定數據庫表中的特定行。…

從零開始做題:老照片中的密碼

老照片中的密碼 1.題目 1.1 給出圖片如下 1.2 給出如下提示 這張老照片中的人使用的是莫爾斯電報機&#xff0c;莫爾斯電報機分為莫爾斯人工電報機和莫爾斯自動電報機&#xff08;簡稱莫爾斯快機&#xff09;。莫爾斯人工電報機是一種最簡單的電報機&#xff0c;由三個部分組…