Java中ArrayList的常見用法示例小結(jié)
Java 中的 ArrayList
是一個非常常用的動態(tài)數(shù)組,它屬于 Java 集合框架的一部分。與普通數(shù)組不同,ArrayList
可以在需要時動態(tài)調(diào)整其大小。以下是 ArrayList
的一些詳細介紹:
基本特性
- 動態(tài)大小:
ArrayList
會自動調(diào)整其大小以適應新元素。 - 有序集合:元素按插入順序存儲,但可以通過索引訪問。
- 允許重復:可以包含重復的元素。
- 允許空值:可以包含
null
值。 - 非線程安全:在多線程環(huán)境下使用時需要手動同步。
常用方法
添加元素
ArrayList<String> list = new ArrayList<>();
添加單個元素:add(E e)
list.add("apple");
- 在指定位置添加:
add(int index, E element)
list.add(1, "banana");
訪問元素
- 通過索引:
get(int index)
- 通過索引:
修改元素
- 修改元素值:
set(int index, E element)
- 修改元素值:
list.set(1, "orange");
刪除元素
- 通過索引刪除:
remove(int index)
- 通過索引刪除:
list.remove(0);
- 通過值刪除(第一個匹配的元素):
remove(Object o)
list.remove("banana");
遍歷元素
for (String item : list) { System.out.println(item); }
其他常用方法
- 獲取大小:
size()
- 檢查是否為空:
isEmpty()
- 清空列表:
clear()
- 檢查是否包含指定元素:
contains(Object o)
- 獲取元素索引:
indexOf(Object o)
- 獲取大小:
性能注意事項
- 時間復雜度:
- 添加/修改/獲取元素:
O(1)
(平均情況) - 在中間插入/刪除元素:
O(n)
- 添加/修改/獲取元素:
- 由于
ArrayList
是基于數(shù)組實現(xiàn)的,當超過初始容量時,可能需要重新分配數(shù)組,這會涉及原數(shù)組到新數(shù)組的復制。
使用示例
import java.util.ArrayList; public class ArrayListExample { public static void main(String[] args) { ArrayList<String> list = new ArrayList<>(); // 添加元素 list.add("apple"); list.add("banana"); list.add("cherry"); // 插入元素 list.add(1, "orange"); // 訪問和修改元素 String fruit = list.get(0); list.set(1, "kiwi"); // 刪除元素 list.remove("banana"); // 輸出列表 for (String item : list) { System.out.println(item); } } }
ArrayList
是適用于頻繁訪問和修改的場景,但在性能和安全性要求較高的情況下,選擇其他集合(如 LinkedList
或同步列表)可能更為合適。
是的, ArrayList
只能存儲引用數(shù)據(jù)類型,不能直接存儲基本數(shù)據(jù)類型(如 int
、double
、char
等)。這是因為 ArrayList
是基于 Java 的泛型實現(xiàn)的,而泛型只支持對象類型(引用類型),不支持基本數(shù)據(jù)類型。
如何存儲基本數(shù)據(jù)類型?
雖然 ArrayList
不能直接存儲基本數(shù)據(jù)類型,但 Java 提供了自動裝箱(Autoboxing)機制,可以將基本數(shù)據(jù)類型自動轉(zhuǎn)換為對應的包裝類,使其間接存儲基本數(shù)據(jù)類型。
常見的基本數(shù)據(jù)類型及其對應的包裝類
基本數(shù)據(jù)類型 | 包裝類(引用類型) |
---|---|
int | Integer |
double | Double |
char | Character |
boolean | Boolean |
float | Float |
long | Long |
short | Short |
byte | Byte |
示例:
ArrayList<Integer> intList = new ArrayList<>(); intList.add(10); // 自動裝箱,將 int 轉(zhuǎn)為 Integer intList.add(20); intList.add(30); System.out.println(intList); // 輸出: [10, 20, 30]
在這個例子中,10
、20
和 30
是 int
類型的數(shù)據(jù),但 Java 自動將它們轉(zhuǎn)換為 Integer
(包裝類)對象,并存入了 ArrayList
。
取值時自動拆箱
存儲在 ArrayList
中的包裝類對象,在需要時會自動轉(zhuǎn)換回基本數(shù)據(jù)類型(稱為“拆箱”)。
示例:
int sum = 0; for (int num : intList) { // 自動拆箱,將 Integer 轉(zhuǎn)為 int sum += num; } System.out.println("總和:" + sum);
注意事項
性能
- 自動裝箱和拆箱雖然使用方便,但它會增加一定的性能開銷,尤其是頻繁操作時。
避免空指針異常
- 如果
ArrayList
中的某個元素為null
,在拆箱時會拋出NullPointerException
。 - 例如:
- 如果
ArrayList<Integer> intList = new ArrayList<>(); intList.add(null); // 添加了一個 null int num = intList.get(0); // 自動拆箱時拋出 NullPointerException
如果需要存儲多個不同的基本數(shù)據(jù)類型?
如果你的 ArrayList
需要同時存儲多種基本數(shù)據(jù)類型,可以考慮以下幾種方式:
使用
ArrayList<Object>
- 通過手動裝箱,將數(shù)據(jù)都存儲為對應的包裝類,然后將它們存入一個
ArrayList<Object>
中。 - 示例:
- 通過手動裝箱,將數(shù)據(jù)都存儲為對應的包裝類,然后將它們存入一個
ArrayList<Object> list = new ArrayList<>(); list.add(123); // 存儲 Integer list.add(45.67); // 存儲 Double list.add("Hello"); // 存儲 String list.add(true); // 存儲 Boolean for (Object obj : list) { System.out.println(obj.toString()); }
使用自定義類進行封裝
- 自定義一個類,把所有需要的數(shù)據(jù)類型存為類的字段。
示例:
class Data { int intValue; double doubleValue; String stringValue; Data(int intValue, double doubleValue, String stringValue) { this.intValue = intValue; this.doubleValue = doubleValue; this.stringValue = stringValue; } } ArrayList<Data> dataList = new ArrayList<>(); dataList.add(new Data(10, 20.5, "Hello")); for (Data data : dataList) { System.out.println(data.intValue + ", " + data.doubleValue + ", " + data.stringValue); }
使用
Map
或其他集合結(jié)構(gòu)- 可以使用
Map<String, Object>
或類似的容器,按鍵值對存儲不同類型的數(shù)據(jù)。
- 可以使用
總結(jié)
ArrayList
只能直接存儲引用類型。- 如果要存儲基本數(shù)據(jù)類型,可以通過包裝類實現(xiàn),依賴于自動裝箱和拆箱機制。
- 對于需要混合存儲多種類型的數(shù)據(jù),可以使用
ArrayList<Object>
或自定義類、Map
等其他結(jié)構(gòu)。-
到此這篇關(guān)于Java中ArrayList的常見用法的文章就介紹到這了,更多相關(guān)Java ArrayList用法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java8新特性之類型注解_動力節(jié)點Java學院整理
這篇文章主要介紹了Java8新特性之類型注解的相關(guān)資料,需要的朋友可以參考下2017-06-06SpringBoot整合GitLab-CI實現(xiàn)持續(xù)集成的過程
這篇文章主要介紹了SpringBoot整合GitLab-CI實現(xiàn)持續(xù)集成,本文詳細講述了 GitLab-CI 持續(xù)集成的安裝、部署、以及配置,需要的朋友可以參考下2022-12-12淺析SpringBoot2底層注解@Conditional@ImportResource
這篇文章主要為大家介紹了SpringBoot2底層注解@Conditional@ImportResource的分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-05-05idea中提示Class 'xxx' is never us
這篇文章主要介紹了idea中提示Class 'xxx' is never used的解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01Java根據(jù)坐標經(jīng)緯度計算兩點距離5種方法及校驗經(jīng)緯度是否在圓/多邊形區(qū)域內(nèi)的算法推薦
在項目開發(fā)過程中需要根據(jù)兩地經(jīng)緯度坐標計算兩地間距離,下面這篇文章主要給大家介紹了關(guān)于Java根據(jù)坐標經(jīng)緯度計算兩點距離5種方法以及校驗經(jīng)緯度是否在圓/多邊形區(qū)域內(nèi)的算法推薦,需要的朋友可以參考下2023-12-12Java中遍歷數(shù)組使用foreach循環(huán)還是for循環(huán)?
這篇文章主要介紹了Java中遍歷數(shù)組使用foreach循環(huán)還是for循環(huán)?本文著重講解for語句的語法并給出使用實例,同時總結(jié)出盡量使用foreach語句遍歷數(shù)組,需要的朋友可以參考下2015-06-06