List 接口

1 List 接口

java.util 中的集合類包含 Java 中某些最常用的類。最常用的集合類是 List 和 Map。
List是一種常用的集合類型,它可以存儲任意類型的對象,也可以結合泛型來存儲具體的類型對象,本質上就是一個容器。

1.1 List 類型介紹

  1. 有序性: List中的元素是按照添加順序進行存放的。因為有序,所以有下標,下標從0開始
  2. 可重復性: List中可以存儲重復的元素
    List中主要有ArrayList、LinkedList兩個實現類。
    在這里插入圖片描述

2 List 接口

2.1 List 初始化

// 創建集合
List list = new ArrayList<>();// 添加元素
list.add("hello");
list.add("world");
list.add("java");// public boolean remove(Object o):刪除指定的元素,返回刪除是否成功
list.remove("world");//true
// public E remove(int index):刪除指定索引處的元素,返回被刪除的元素
list.remove(1);//world
// public E set(int index,E element):修改指定索引處的元素,返回被修改的元素
list.set(1,"javaee");//world// IndexOutOfBoundsException
list.remove(3);

2.2 List 常用API

ArrayList和LinkedList通用方法。

方法名								說明
public boolean add(要添加的元素)		將指定的元素追加到此集合的末尾
public boolean remove(要刪除的元素)	刪除指定元素,返回值表示是否刪除成功
public E remove(int index)			刪除指定索引處的元素,返回被刪除的元素
public E set(int index,E element)	修改指定索引處的元素,返回被修改的元素
public E get(int index)				返回指定索引處的元素
public int size()					返回集合中的元素的個數
boolean contains(Object o)			如果此列表包含指定的元素,則返回 true
boolean addAll(int index, Collection<? extends E> c)									將指定集合中的所有元素插入到此列表中,從指定的位置開始
void clear()						列表中刪除所有元素

2.3 List 遍歷方式

List<String> list = new ArrayList<String>();
list.add("aaa");
list.add("bbb");
list.add("ccc");//方法一:超級for循環遍歷
for(String attribute : list) {System.out.println(attribute);
}
//方法二:對于ArrayList來說速度比較快, 用for循環, 以size為條件遍歷:
for(int i = 0 ; i < list.size() ; i++) {system.out.println(list.get(i));
}
//方法三:集合類的通用遍歷方式, 從很早的版本就有, 用迭代器迭代
Iterator it = list.iterator();
while(it.hasNext()) {System.ou.println(it.next);
}

3 ArrayList

ArrayList是Java中的實現List接口的類,底層使用數組來存儲元素。但與數組相比,它具有更靈活的大小和動態的增加和刪除元素。

注意: 由于 ArrayList 底層使用的是數組,因此一旦創建了 ArrayList,它的大小就是固定的。而當元素添加到 ArrayList 中時,如果底層數組已滿,則需要創建一個更大的數組,并將原有元素復制到新數組中,這會帶來一定的性能損耗。
因此,在實際開發中,建議在創建 ArrayList 時設置一個合適的初始化容量,避免在運行時頻繁進行擴容操作,同時也可避免浪費過多空間資源。
例如:new ArrayList(50);將ArrayList初始容量改為50

3.1 ArrayList 數據結構

ArrayList的數據結構本質上就是數組。區別在于,數組是一種靜態的數據結構,需要在創建數組時就指定它的長度,并且創建后長度無法改變。而ArrayList是一種動態的數據結構,它可以自動進行擴容。

3.2 ArrayList 類定義

public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable

ArrayList是一個繼承于AbstractList的線性數據結構。

AbstractList提供了List接口的默認實現(個別方法為抽象方法)

  • ArrayList 實現 List 接口,能對它進行隊列操作。
  • ArrayList 實現了Cloneable接口,即覆蓋了函數clone(),能克隆。
  • ArrayList 實現java.io.Serializable接口,這意味著LinkedList支持序列化,能通過序列化去傳輸。
  • ArrayList 實現RandomAccess接口,提供了隨機訪問功能。RandmoAccess是java中用來被List實現,為List提供快速訪問功能的。在ArrayList中,我們即可以通過元素的序號快速獲取元素對象;這就是快速隨機訪問。
    在這里插入圖片描述

3.3 ArrayList 特點

除了具備List有序性、可重復性特點外,ArrayList還具備以下的特點:

  • 自動擴容 :當向ArrayList中加入的元素超過了其默認的長度時(由于ArrayList是數組的封裝類,在創建ArrayList時不用給定長度,其默認長度為10),它會自動擴容以增加存儲容量
  • 隨機訪問:隨機訪問是指可以直接訪問元素,而不需要從頭部或者尾部遍歷整個列表。由于ArrayList底層是用數組實現的,因此可以通過索引來快速訪問元素。
  • 慢速插入/刪除::相比于鏈表(如LinkedList),ArrayList在中間插入或刪除元素較慢,因為需要移動元素。
  • 高效的遍歷:由于ArrayList底層采用了數組來存儲元素,所以對于ArrayList的遍歷操作比較高效。

3.4 ArrayList 特定API

方法名							說明
ArrayList() 					ArrayList構造函數。默認容量是10
ArrayList(int initialCapacity)  ArrayList帶容量大小的構造函數
ArrayList(Collection<? extends E> c)創建一個包含collection的ArrayList
trimToSize()					將內部存儲的數組大小調整為列表中元素的實際數量。
ensureCapacity(int minCapacity)	設置內部存儲的數組大小,以容納指定數量的元素。
toArray(T[] a)					將列表中的元素轉換為指定類型的數組

4 LinkedList

LinkedList也是Java中實現List接口的常用集合類,底層使用的是雙向鏈表數據結構。

與ArrayList不同,LinkedList在內部存儲元素時,不是使用連續的內存空間,而是使用一個鏈表來存儲元素。

4.1 LinkedList 數據結構

LinkedList底層采用的是雙向鏈表(doubly linked list) 數據結構。鏈表中的每個節點(結點)都由兩個部分組成,一部分是存儲數據元素的值域,另一部分是指向前一個節點和后一個節點的指針(引用)。對于雙向鏈表來說,除了一個指向前一個節點的指針外,還有一個指向后一個節點的指針
在這里插入圖片描述

4.2 LinkedList 類定義

public class LinkedList<E>extends AbstractSequentialList<E>implements List<E>, Deque<E>, Cloneable, java.io.Serializable

LinkedList 是一個繼承于AbstractSequentialList的雙向鏈表。它也可以被當作堆棧、隊列或雙端隊列進行操作。

為什么要繼承自AbstractSequentialList ?
AbstractSequentialList 實現了get(int index)、set(int index, E element)、add(int index, E element) 和 remove(int index)這些骨干函數。降低了List接口的復雜度。LinkedList雙向鏈表通過繼承于AbstractSequentialList,就相當于已經實現了“get(int index)這些接口”。
此外,若需要通過AbstractSequentialList自己實現一個自定義列表,只需要擴展此類,并提供 listIterator() 和 size() 方法的實現即可。若要實現不可修改的列表,則需要實現列表迭代器的 hasNext、next、hasPrevious、previous 和 index 方法即可。

  • LinkedList 實現 List 接口,能對它進行隊列操作。
  • LinkedList 實現 Deque 接口,即能將LinkedList當作雙端隊列使用。
  • LinkedList 實現了Cloneable接口,即覆蓋了函數clone(),能克隆。
  • LinkedList 實現java.io.Serializable接口,這意味著LinkedList支持序列化,能通過序列化去傳輸。
    LinkedList 是非同步的。
    在這里插入圖片描述

4.3 LinkedList 特點

  • 隨機訪問性能較差:LinkedList的隨機訪問性能較差,因為在鏈表中要從頭開始遍歷鏈表,直到找到目標元素。所以如果在代碼中需要頻繁進行隨機訪問元素的操作,LinkedList可能不是一個最佳的選擇。
  • 添加/刪除操作快:由于LinkedList底層使用雙向鏈表,因此它的添加和刪除操作非常快,因為只需要更改指針的指向即可,不需要像ArrayList一樣重新分配數組空間,而且LinkedList還支持在指定位置插入和刪除元素。
  • 需要額外空間:鏈表中每個節點都需要額外存儲到前一個和后一個節點的指針,因此比數組等其他數據結構需要更多的內存空間。
  • 適用于隊列和雙端隊列:LinkedList還可以支持隊列和雙端隊列的功能,如在鏈表頭部或尾部添加或刪除元素,實現隊列和雙端隊列的常見操作。

4.4 LinkList 特定API

方法名				說明
LinkedList()		構造方法
LinkedList(Collection<? extends E> c) 創建一個包含collection的LinkedList
addFirst(E element)	將元素添加到列表的開頭
getFirst()  		返回列表的第一個元素。
getLast()			返回列表的最后一個元素。
removeFirst()		刪除并返回列表的第一個元素。
removeLast()		刪除并返回列表的最后一個元素。

5 ArrayList與LinkedList的比較

  • 由于ArrayList的數據結構為數組,所以查詢修改快,新增刪除慢;而LinkedList的數據結構為鏈表結構,所以查詢修改慢,新增刪除快
  • ArrayList是基于數組實現的動態數組,在內存中有連續的空間,可以通過下標訪問元素,由于數組需要提前分配一定大小的空間,因此當元素數量增多之后,可能會導致數組空間不足需要重新分配數組,這種情況下可能會出現內存空間浪費;相比之下,LinkedList是基于鏈表實現的,每個元素都有一個引用指向下一個元素,不需要提前分配空間,因此能夠更加靈活地插入和刪除元素。然而,鏈表在內存中是不連續的,每個元素的引用占用額外的內存空間。由于鏈表中每個元素都需要有一個指向下一個元素的引用,因此在存儲同樣數量的元素時,LinkedList通常會占用比ArrayList更大的內存空間。

轉載鏈接

https://www.cnblogs.com/lzq198754/p/5780165.html
https://blog.csdn.net/TestXzing/article/details/131197073
https://blog.csdn.net/jianyuerensheng/article/details/51204598

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

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

相關文章

06-React組件 Redux React-Redux

React組件化&#xff08;以Ant-Design為例&#xff09; 組件化編程&#xff0c;只需要去安裝好對應的組件&#xff0c;然后通過各式各樣的組件引入&#xff0c;實現快速開發 我們這里學習的是 Ant-design &#xff08;應該是這樣&#xff09;&#xff0c;它有很多的組件供我們…

計算機網絡測試題第二部分

前言:如果沒有做在線測試請自主獨立完成&#xff0c;本篇文章只作為學習計算機網絡的參考&#xff0c;題庫中的題存在一定錯誤和不完整&#xff0c;請學習時&#xff0c;查找多方書籍論證&#xff0c;獨立思考&#xff0c;如果存在疑慮可以評論區討論。查看時&#xff0c;請分清…

pytorch debug 常用工具

自動辨識圖像格式可視化 import numpy as np import matplotlib.pyplot as plt from PIL import Imagedef convert_to_numpy(image_input):"""自動檢測輸入圖像類型&#xff0c;并將其轉換為NumPy數組。"""if isinstance(image_input, np.ndarr…

7-3 Left-pad

根據新浪微博上的消息&#xff0c;有一位開發者不滿NPM&#xff08;Node Package Manager&#xff09;的做法&#xff0c;收回了自己的開源代碼&#xff0c;其中包括一個叫left-pad的模塊&#xff0c;就是這個模塊把javascript里面的React/Babel干癱瘓了。這是個什么樣的模塊&a…

物聯網IC

物聯網IC 電子元器件百科 文章目錄 物聯網IC前言一、物聯網IC是什么二、物聯網IC的類別三、物聯網IC的應用實例四、物聯網IC的作用原理總結前言 物聯網IC的功能和特性可以根據不同的物聯網應用需求來選擇和配置,以滿足物聯網設備在連接、通信、感知和控制方面的需求。 一、物…

猜數字游戲Ⅱ

你和朋友一起玩猜數字游戲&#xff0c;你寫出一個秘密數字&#xff0c;請朋友猜這個數字是多少。朋友每猜測一次&#xff0c;你就會給他一個包含下述信息的提示&#xff1a; 猜測數字中有多少位屬于數字和確切位置都猜對了&#xff08;稱為 "Bulls"&#xff0c;公牛&…

VOL-vue 框架 文件上傳控件關于大文件上傳等待的修改

我的項目在測試voltable列表組件中對阿里云OSS做附件上傳時&#xff0c;幾十M的文件可能就會需要一段時間來上傳&#xff0c;才能有OSS的狀態和鏈接返回。 但是控件VolUpload.vue并沒有去在這方面做任何交互體驗上的控制&#xff0c;而且VolUpload.vue本身寫的幾個上傳函數都是…

SpringBoo在項目停止(服務停止/關閉退出)之后執行的方法

SpringBoo在項目停止/服務停止/關閉退出之后執行的方法 1.實現DisposableBean接口2.使用PreDestroy注解 SpringApplication會向JVM注冊一個關閉鉤子(hook)&#xff0c;以確保ApplicationContext在退出時正常關閉。 可以使用所有標準的Spring生命周期回調&#xff08;例如Dispos…

內測分發是什么?十年的前端開發者帶你了解

內測分發是軟件開發過程中的一個階段&#xff0c;特別指軟件還未完全完成或準備對外廣泛發布前&#xff0c;向一定范圍的用戶群體提供該軟件版本的測試機會&#xff0c;以便收集反饋和修復潛在的問題。在講解內測分發之前&#xff0c;我們需要明確幾個相關概念&#xff1a; 軟件…

區塊鏈媒體宣發:揭示優勢與趨勢,引領信息傳播新時代

在數字化潮流中&#xff0c;區塊鏈技術正以驚人的速度改變著傳媒行業的格局。從區塊鏈媒體宣發中獲得的種種優勢和未來的趨勢&#xff0c;不僅為企業帶來了新的推廣途徑&#xff0c;也在信息傳播領域掀起了一場革命。本文將深入探討區塊鏈媒體宣發的優勢以及未來的發展趨勢。 1…

排序算法---選擇排序

1.實現流程&#xff1a; 1. 把第一個沒有排序過的元素設置為最小值&#xff1b; 2. 遍歷每個沒有排序過的元素&#xff1b; 3. 如果元素 < 現在的最小值&#xff1b; 4. 將此元素設置成為新的最小值&#xff1b; 5. 將最小值和第一個沒有排序過的位置交換 選擇排序執行流程…

初識Ceph --組件、存儲類型、存儲原理

目錄 ceph組件存儲類型塊存儲文件存儲對象存儲 存儲過程 ceph Ceph&#xff08;分布式存儲系統&#xff09;是一個開源的分布式存儲系統&#xff0c;設計用于提供高性能、高可靠性和可擴展性的存儲服務&#xff0c;可以避免單點故障&#xff0c;支持塊存儲、對象存儲以及文件系…

【小白專用】Apache2.4+PHP8.3+MYSQL的配置

1.下載PHP和Apache 1、PHP下載 PHP For Windows: Binaries and sources Releases 注意&#xff1a; 1.使用Apache作為服務器的話&#xff0c;一定要下載Thread Safe的&#xff0c;否則沒有php8apache2_4.dll這個文件&#xff0c; 如果使用IIS的請下載 NON Tread safe的 2.如果…

USB連接器

USB連接器 電子元器件百科 文章目錄 USB連接器前言一、USB連接器是什么二、USB連接器的類別三、USB連接器的應用實例四、USB連接器的作用原理總結前言 USB連接器的使用廣泛,幾乎所有現代電子設備都具備USB接口,使得設備之間的數據傳輸和充電變得簡單和便捷。 一、USB連接器是…

element-ui按鈕el-button,點擊之后恢復之前的顏色

在開發過程中, 使用el-button 按鈕點擊之后, 沒有恢復到之前的顏色, 還是保持點擊之后的顏色,需要解決這個問題, <template><div><el-button size"mini" type"primary" plain click"onClick($event)">按鈕</el-button>…

iOS按鈕控件UIButton使用

1.在故事板中添加按鈕控件,步聚如下: 同時按鈕Shift+Commad+L在出現在控件庫中選擇Button并拖入View Controller Scene中 將控件與變量btnSelect關聯 關聯后空心變實心 如何關聯?直接到屬性窗口拖按鈕變量到控件上,出現一條線,然后松開,這樣就關聯成功了 關聯成功后屬性窗口…

LinuxBasicsForHackers筆記 -- 了解和檢查無線網絡

無線網絡 AP (access point) – 無線用戶連接以訪問互聯網的設備。SSID (service set identifier) – 網絡的名稱。ESSID (extended service set identifier) – 與 SSID 相同&#xff0c;但它可用于無線 LAN 中的多個 AP。BSSID (basic service set identifier) – 每個AP的唯…

ISP IC/FPGA設計-第一部分-MT9V034攝像頭分析(0)

MT9V034為CMOS圖像傳感器&#xff0c;有著極其優秀的圖像成像性能&#xff0c;同時支持豐富的功能用于isp的開發&#xff1b;MT9V034 的HDR寬動態、10bit數據深度、RAW格式&#xff08;bayer陣列&#xff09;圖像、dvp和lvds接口、60fps正是學習isp開發的理想傳感器&#xff1b…

使用Git進行版本控制

參考&#xff1a;《Python編程從入門到實踐》 前言1、安裝、配置 Git1.1 在Linux系統中安裝Git1.2 在OS X系統中安裝Git1.3 在Windows系統中安裝Git1.4 配置Git 2、創建項目3、忽略文件4、初始化倉庫5、檢查狀態6、將文件加入到倉庫中7、執行提交8、查看提交歷史 前言 版本控制…

C語言 預處理 + 條件編譯宏 + 井號運算符

預處理階段任務 預處理指令 條件編譯宏 條件編譯宏的作用在于根據編譯時的條件進行代碼的選擇性編譯&#xff0c;從而實現不同環境、不同配置或不同功能的編譯版本。 這可以用于實現調試模式和發布模式的切換&#xff0c;平臺適配&#xff0c;以及選擇性地編譯不同的功能模塊等…