數據結構(Java實現):ArrayList

目錄

  • 1.ArrayList簡介
  • 2.ArrayList構造方法分析
  • 3.ArrayList的add方法以及擴容機制
  • 4.ArrayList常用方法
  • 5.ArrayList遍歷
  • 6.ArrayList的缺陷

1.ArrayList簡介

在集合框架中,ArrayList是一個普通的類,實現了List接口,具體框架圖如下:
在這里插入圖片描述
說明

  1. ArrayList是以泛型方式實現的,使用時必須要先實例化
  2. ArrayList實現了RandomAccess接口,表明ArrayList支持隨機訪問
  3. ArrayList實現了Cloneable接口,表明ArrayList是可以clone的
  4. ArrayList實現了Serializable接口,表明ArrayList是支持序列化的
  5. 和Vector不同,ArrayList不是線程安全的,在單線程下可以使用,在多線程中可以選擇Vector或者CopyOnWriteArrayList
  6. ArrayList底層是一段連續的空間,并且可以動態擴容,是一個動態類型的順序表

2.ArrayList構造方法分析

ArrayList有三個構造方法
在這里插入圖片描述
1.無參的構造方法
在這里插入圖片描述
首先我們看到一個elementData為ArrayList定義好的一個數組,默認為空,指數一個數組引用。然后看到DEFAULTCAPACITY_EMPTY_ELEMENTDATA
在這里插入圖片描述
可以看到并沒有給數組分配內存。

2.帶一個int參數的構造方法(可以給ArrayList設置一個初始容量)
在這里插入圖片描述
先看到if判斷語句,當傳入參數大于0時,直接分配一個參數大小的空間
在這里插入圖片描述
傳入參數等于0時與無參構造方法一樣,并不會給數組分配空間
在這里插入圖片描述
傳入參數小于0就會拋出一個異常
在這里插入圖片描述
3.帶一個類型變量參數的構造方法
在這里插入圖片描述
我們先對傳入的參數進行解析Collection<? extends E> c
在這里插入圖片描述
這樣我們就可以傳入一個ArrayList變量,舉例如下

public static void main(String[] args) {ArrayList<Integer> arrayList=new ArrayList<>();arrayList.add(10);arrayList.add(20);ArrayList<Integer> arrayList1=new ArrayList<>(arrayList);/*傳入一個ArrayList變量,這個參數需要滿足了下幾個條件才能夠傳遞*1.ArrayList實現了Collection接口*2.參數類型是arrayList1指定的泛型本身“Integer”*/}

3.ArrayList的add方法以及擴容機制

在這里插入圖片描述
看到上面的add方法,左邊的add方法通過調用右邊的add方法進行數據的插入操作,下面我們重點來講解左邊這個add方法
在這里插入圖片描述
首先看到if判斷語句,當數據的數量等于數組的長度就會調用grow方法進行擴容。
在這里插入圖片描述
grow方法又調用了另一個grow方法
在這里插入圖片描述
先看到if里面的判斷語句,oldCapacity > 0 || elementData != DEFAULTCAPACITY_EMPTY_ELEMENTDATA當數組容量初始為DEFAULTCAPACITY_EMPTY_ELEMENTDATA(空)的時候進入else語句elementData = new Object[Math.max(DEFAULT_CAPACITY, minCapacity)];給數組分配空間為DEFAULT_CAPACITYminCapacity的最大值
在這里插入圖片描述
看到DEFAULT_CAPACITY的值為10,所以當數組初始空間為空時就會給數組分配一個容量為10的內存。正常進入if語句就會觸發ArrayList的擴容機制
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
擴容的空間大概是原來的1.5倍,通過一步一步調用上面的方法(了解)

4.ArrayList常用方法

在這里插入圖片描述
舉例如下

public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("JavaSE");
list.add("JavaWeb");
list.add("JavaEE");
list.add("JVM");
list.add("測試課程");
System.out.println(list);
// 獲取list中有效元素個數
System.out.println(list.size());
// 獲取和設置index位置上的元素,注意index必須介于[0, size)間
System.out.println(list.get(1));
list.set(1, "JavaWEB");
System.out.println(list.get(1));
// 在list的index位置插入指定元素,index及后續的元素統一往后搬移一個位置
list.add(1, "Java數據結構");
System.out.println(list);
// 刪除指定元素,找到了就刪除,該元素之后的元素統一往前搬移一個位置
list.remove("JVM");
System.out.println(list);
// 刪除list中index位置上的元素,注意index不要超過list中有效元素個數,否則會拋出下標越界異常
list.remove(list.size()-1);
System.out.println(list);
// 檢測list中是否包含指定元素,包含返回true,否則返回false
if(list.contains("測試課程")){
list.add("測試課程");
}
// 查找指定元素第一次出現的位置:indexOf從前往后找,lastIndexOf從后往前找
list.add("JavaSE");
System.out.println(list.indexOf("JavaSE"));
System.out.println(list.lastIndexOf("JavaSE"));
// 使用list中[0, 4)之間的元素構成一個新的SubList返回,但是和ArrayList共用一個elementData數組
List<String> ret = list.subList(0, 4);
System.out.println(ret);
list.clear();
System.out.println(list.size());
}

5.ArrayList遍歷

ArrayList 可以使用三方方式遍歷:for循環+下標、foreach、使用迭代器

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遍歷
for (int i = 0; i < list.size(); i++) {
System.out.print(list.get(i) + " ");
}
System.out.println();
// 借助foreach遍歷
for (Integer integer : list) {
System.out.print(integer + " ");
}
System.out.println();
Iterator<Integer> it = list.listIterator();
while(it.hasNext()){
System.out.print(it.next() + " ");
}
System.out.println();
}

注意

  1. ArrayList最長使用的遍歷方式是:for循環+下標 以及 foreach
  2. 迭代器是設計模式的一種,后序容器使用更多,在進行詳細介紹

6.ArrayList的缺陷

由于ArrayList底層是一段連續空間,當在ArrayList任意位置插入或者刪除元素時,就需要將后序元素整體往前或者往后搬移,時間復雜度為O(n),效率比較低,因此ArrayList不適合做任意位置插入和刪除比較多的場景
為解決這個問題,java集合中又引入了LinkedList,即鏈表結構。下面一篇文章將詳細講解鏈表結構,大家可以關注一下。

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

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

相關文章

編寫一個llvm編譯器插件,完成在store匯編指令前對內存合法性的check。

dds(iceoryx、fastdds等)中間件采用了共享內存&#xff0c;如果app內存越界將共享內存踩踏壞了&#xff0c;將會形成災難。本插件可以檢測到app是否在寫共享內存&#xff0c;如果是&#xff0c;我們可以讓app assert。從而提高dds的穩定性 插件效果&#xff1a; 插件源碼&…

話題:如何讓大模型變得更聰明?

隨著人工智能&#xff08;AI&#xff09;技術的迅速發展&#xff0c;大模型&#xff08;如GPT-4、BERT、Transformer等&#xff09;在自然語言處理、圖像識別和語音識別等領域取得了顯著成果。然而&#xff0c;如何讓大模型變得更聰明&#xff0c;進一步提升其性能和應用效果&a…

Netty: Netty中的組件

文章目錄 一、EventLoop1、EventLoop2、EventLoopGroup&#xff08;1&#xff09;處理普通時間和定時任務&#xff08;2&#xff09;處理IO任務 二、Channel三、Future&Promise四、Handler&Pipeline五、ByteBuf 一、EventLoop 1、EventLoop EventLoop本質是一個單線程…

Jetbrain | IDEA的啟動logo替換成可愛的vtuber-logo

看了這個&#xff0c;好可愛 【上Github熱榜了&#xff01;當編程語言的Logo變得可愛起來~】 又看了這個 光速整活&#xff0c;強啊 看到很多人整IDEA的logo包括我自己&#xff0c;都不是特別方便的搞&#xff0c;我就直接把文件放在綁定資源里直接下吧 然后直接找到本體的安…

ios swift5 codable字典轉模型,第三方庫SmartCodable

文章目錄 1.用第三方庫SmartCodable, github地址2.使用示例 1.用第三方庫SmartCodable, github地址 SmartCodable - github 2.使用示例 import Foundation import SmartCodablestruct CommonModel: SmartCodable {var message: String ""var success: Bool fals…

【深度學習】與【PyTorch實戰】

目錄 一、深度學習基礎 1.1 神經網絡簡介 1.2 激活函數 1.3 損失函數 1.4 優化算法 二、PyTorch基礎 2.1 PyTorch簡介 2.2 張量操作 2.3 構建神經網絡 2.4訓練模型 2.5 模型評估 三、PyTorch實戰 3.1 數據加載與預處理 3.2 模型定義與訓練 3.3 模型評估與調優 3…

成都青年AI人才嶄露頭角,知了匯智科技助力孵化營大放異彩

5月18日-19日&#xff0c;為期兩天的成都國際商貿城青年&#xff08;大學生&#xff09;AI應用孵化營活動在熱烈的氛圍中圓滿落幕。本次活動由成都國際商貿城、成都成商數字科技有限公司、成都知了匯智科技有限公司及成都電商職教集團聯合舉辦&#xff0c;旨在為青年&#xff0…

丟失api-ms-win-crt-runtime-l1-1-0.dll的多種解決方法分析,教你簡單的一鍵修復

在使用Windows操作系統時&#xff0c;用戶可能會遇到一個涉及丟失 ?api-ms-win-crt-runtime-l1-1-0.dll文件的警告&#xff0c;這可能導致某些程序無法正常運行。該DLL文件屬于Microsoft Visual C Redistributable軟件包的一部分&#xff0c;這個軟件包為多個應用提供運行時支…

Mybatis-plus的兩種分頁方案

Mybatis-plus的兩種分頁方案 底層的邏輯是寫出最終執行的sql或者selectPage方法等&#xff0c;中間需要配置相應的page攔截器。 注意&#xff1a;如沒有配置攔截器&#xff0c;直接執行就會存在total的值為0&#xff0c;此方法無效。 1. 基于MP的IPage接口實現 使用步驟&am…

深度學習-Softmax回歸+損失函數+圖像分類數據集

目錄 Softmax回歸回歸 VS 分類Kaggle上的分類問題 從回歸到多類分類回歸分類從回歸到多類分類-均方損失從回歸到多類分類-無校驗比例從回歸到多類分類-校驗比例 Softmax和交叉熵損失總結損失函數均方損失絕對值損失函數魯棒損失 圖像分類數據集通過框架中內置函數將FashionMNIS…

RabbitMQ---交換機-Fanout-Direct

Publisher&#xff1a;生產者&#xff0c;不再發送消息到隊列中&#xff0c;而是發給交換機Exchange&#xff1a;交換機&#xff0c;一方面&#xff0c;接收生產者發送的消息。另一方面&#xff0c;知道如何處理消息&#xff0c;例如遞交給某個特別隊列、遞交給所有隊列、或是將…

刪除實例分割中的特定標簽

用labelme軟件對圖像進行實例分割或語義分割標注后會得到json文件&#xff0c;如果想要刪除某個特定標簽&#xff0c;可以使用如下代碼&#xff0c;完整代碼下載地址&#xff1a;代碼地址 import json import os# 要處理的json文件夾路徑 folder_path H:/json # 需要刪除的標…

如何一鍵生成多個文本二維碼?excel表格批量生碼的方法

現在很多人會將文本信息做成二維碼來展示&#xff0c;當有同類型內容生成大量二維碼時&#xff0c;可以使用將文本導入excel表格的方式&#xff0c;將表格中的每條數據批量生成二維碼&#xff0c;可以有效提升二維碼制作的速度和效率。下面就讓小編來將具體的操作步驟分享給大家…

LangChain API 2.0

轉載整理自&#xff1a;https://api.python.langchain.com/en/latest/langchain_api_reference.html 文章目錄 1、langchain.agentsClassesFunctions 2、langchain.callbacksClasses 3、langchain.chainsClassesFunctions 4、langchain.embeddingsClasses 5、langchain.evaluat…

二叉樹順序結構及鏈式結構

一.二叉樹的順序結構 1.定義&#xff1a;使用數組存儲數據&#xff0c;一般使用數組只適合表示完全二叉樹&#xff0c;此時不會有空間的浪費 注&#xff1a;二叉樹的順序存儲在邏輯上是一顆二叉樹&#xff0c;但是在物理上是一個數組&#xff0c;此時需要程序員自己想清楚調整…

http流式返回

HTTP流式返回&#xff08;Stream&#xff09;是一種服務器向客戶端傳輸數據的方式允許數據分塊發送而不是一次性發送完畢。 這樣客戶端可以在接收到第一部分數據時就開始處理&#xff0c;而不必等待整個響應完成。 應用場景&#xff1a; 2.1 業務場景&#xff1a;圖表的監聽&a…

手動安裝maven依賴到本地倉庫

使用mvn install命令安裝jar包到指定的倉庫。 命令如下&#xff1a; mvn install:install-file -Dmaven.repo.localC:\Users\liyong.m2\repository -DgroupIdcom.aspose -DartifactIdwords -Dversion18.4 -Dpackagingjar -DfileC:\Users\liyong\Desktop\jar\words-18.4.jar 解釋…

grafana + Prometheus + node-exporter + pushgateway + alertmanager的監控解決方案

業內比較著名的監控解決方案&#xff0c;據筆者所知&#xff0c;大概是三套&#xff1a; 一個是zabbix的解決方案&#xff0c;一個是prometheusgrafana&#xff0c;一個是ELK zabbix比較重&#xff0c;而且原生支持監控SNMP&#xff0c;自帶一個儀表盤&#xff0c;不需要額外…

docker redis 持久化

1、拉取redis鏡像 docker pull redis:latest 2、 mkdir /data/redis 3、填充redis.conf文件及根據需求修改相應的配置 ?通過官網地址找到對應版本的配置文件 ?將配置信息復制到redis.conf中 ?常見的修改配置 https://redis.io/docs/latest/operate/oss_and_stack/managem…

高仿果汁導航模板

參考原文&#xff1a;果汁導航風格模板_1234FCOM專注游戲工具及源碼例子分享 極速云