Java toArray() 方法 的使用
一、toArray()方法簡(jiǎn)介
toArray() 是 Java 集合框架中定義在 java.util.Collection 接口里的一個(gè)方法,用于將集合轉(zhuǎn)換為數(shù)組。
方法簽名:
// 無(wú)參版本 Object[] toArray(); // 泛型版本(推薦使用) <T> T[] toArray(T[] a);
二、兩種toArray()的區(qū)別
1. 無(wú)參toArray()
- 返回一個(gè) Object 類(lèi)型數(shù)組
- 需要強(qiáng)制類(lèi)型轉(zhuǎn)換才能使用具體類(lèi)型
List<String> list = List.of("Java", "Python", "C++");
Object[] arr = list.toArray();
System.out.println(Arrays.toString(arr));
// 輸出: [Java, Python, C++]
?? 但是如果你想用 String[] 接收,手動(dòng)轉(zhuǎn)換:
String[] strArr = (String[]) list.toArray(); // 會(huì)報(bào)錯(cuò) ?
會(huì)拋出:
class [Ljava.lang.Object; cannot be cast to class [Ljava.lang.String; ([Ljava.lang.Object; and [Ljava.lang.String; are in module java.base of loader 'bootstrap')
原因:toArray() 返回的是 Object[],而不是 String[]。因?yàn)閿?shù)組在運(yùn)行時(shí)知道自己的具體類(lèi)型,反過(guò)來(lái)不能轉(zhuǎn)換
2. 帶參數(shù)的toArray(T[] a)(推薦使用)
這個(gè)方法允許我們指定返回?cái)?shù)組的類(lèi)型,是更安全、類(lèi)型友好的方式。
List<String> list = List.of("Java", "Python", "C++");
String[] arr = list.toArray(new String[0]);
System.out.println(Arrays.toString(arr));
// 輸出: [Java, Python, C++]
推薦寫(xiě)法:
T[] array = list.toArray(new T[0]);
JDK 11 以后甚至可以這樣寫(xiě):
String[] arr = list.toArray(String[]::new);
這種方式使用了 方法引用(Method Reference),更加簡(jiǎn)潔高效。
三、toArray(T[] a)方法的內(nèi)部機(jī)制
JDK 源碼(簡(jiǎn)化版):
public <T> T[] toArray(T[] a) {
if (a.length < size)
// 如果傳入數(shù)組太小,則創(chuàng)建一個(gè)新的同類(lèi)型數(shù)組
return (T[]) Arrays.copyOf(elementData, size, a.getClass());
System.arraycopy(elementData, 0, a, 0, size);
if (a.length > size)
a[size] = null;
return a;
}
?? 可以看出:
- 若傳入數(shù)組大小不夠,會(huì)創(chuàng)建一個(gè)新的;
- 若傳入數(shù)組更大,則多余部分置為
null; - 返回的數(shù)組類(lèi)型與傳入數(shù)組的類(lèi)型一致。
四、相關(guān)案例
示例 1:List 轉(zhuǎn)數(shù)組
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5); // 推薦寫(xiě)法 Integer[] numArray = numbers.toArray(new Integer[0]); System.out.println(Arrays.toString(numArray)); // 輸出: [1, 2, 3, 4, 5]
示例 2:Set 轉(zhuǎn)數(shù)組
Set<String> set = new HashSet<>(Arrays.asList("A", "B", "C"));
String[] arr = set.toArray(new String[0]);
System.out.println(Arrays.toString(arr));
// 輸出: [A, B, C]
示例 3:使用方法引用(Java 11+)
List<String> list = List.of("Java", "Kotlin", "Scala");
// 使用方法引用創(chuàng)建新數(shù)組
String[] arr = list.toArray(String[]::new);
System.out.println(Arrays.toString(arr));
// 輸出: [Java, Kotlin, Scala]
示例 4:數(shù)組大小影響演示
List<String> list = List.of("A", "B", "C");
// 數(shù)組大小剛好
String[] arr1 = list.toArray(new String[3]);
System.out.println(Arrays.toString(arr1)); // [A, B, C]
// 數(shù)組大小過(guò)小
String[] arr2 = list.toArray(new String[1]); // 會(huì)創(chuàng)建新數(shù)組
System.out.println(Arrays.toString(arr2)); // [A, B, C]
// 數(shù)組大小過(guò)大
String[] arr3 = list.toArray(new String[5]);
System.out.println(Arrays.toString(arr3)); // [A, B, C, null, null]
五、數(shù)組轉(zhuǎn)集合(反向操作)
除了 toArray(),我們也常常需要把數(shù)組變成集合,可以使用:
String[] arr = {"A", "B", "C"};
List<String> list = Arrays.asList(arr);
System.out.println(list); // [A, B, C]
?? 注意:Arrays.asList() 返回的是一個(gè)定長(zhǎng)列表,不能添加或刪除元素。
如果需要可變集合:
List<String> list = new ArrayList<>(Arrays.asList(arr));
list.add("D"); // ?
六、常見(jiàn)錯(cuò)誤與注意事項(xiàng) ??
| 錯(cuò)誤場(chǎng)景 | 問(wèn)題說(shuō)明 | 正確做法 |
|---|---|---|
| (String[]) list.toArray() | 會(huì)拋出類(lèi)型轉(zhuǎn)換異常 | list.toArray(new String[0]) |
| 數(shù)組大小過(guò)小 | 自動(dòng)創(chuàng)建新數(shù)組 | ? 安全 |
| 數(shù)組大小過(guò)大 | 多余部分會(huì)置 null | 注意空指針判斷 |
| 修改數(shù)組不影響集合 | 二者是獨(dú)立的 | toArray() 復(fù)制數(shù)據(jù) |
| Arrays.asList() 不可添加刪除元素 | 固定長(zhǎng)度 | 用 new ArrayList<>(...) |
七、性能小貼士
- 對(duì)于頻繁轉(zhuǎn)換的場(chǎng)景(尤其是大集合),建議使用:
list.toArray(new String[list.size()]);
避免額外的數(shù)組分配操作。
- 對(duì)于小集合或不確定大小,推薦:
list.toArray(new String[0]);
更簡(jiǎn)潔、安全。
JVM 對(duì) new T[0] 模式已有優(yōu)化(JDK 11+ 性能與預(yù)分配數(shù)組幾乎無(wú)差異)。
八、總結(jié)表
| 方法 | 返回類(lèi)型 | 是否安全 | 適用場(chǎng)景 |
|---|---|---|---|
| toArray() | Object[] | 否(需強(qiáng)轉(zhuǎn)) | 快速調(diào)試或簡(jiǎn)單場(chǎng)景 |
| toArray(T[] a) | T[] | ? 是 | 泛型集合轉(zhuǎn)換 |
| toArray(String[]::new) | T[] | ? 推薦 | Java 11+ 優(yōu)雅寫(xiě)法 |
到此這篇關(guān)于Java toArray() 方法 的使用的文章就介紹到這了,更多相關(guān)Java toArray() 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Maven本地打包war包實(shí)現(xiàn)代碼解析
這篇文章主要介紹了Maven本地打包war包實(shí)現(xiàn)代碼解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09
java實(shí)現(xiàn)簡(jiǎn)易版圖形界面計(jì)算器
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡(jiǎn)易版圖形界面計(jì)算器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-05-05
Java?Web開(kāi)發(fā)中的分頁(yè)與參數(shù)校驗(yàn)舉例詳解
這篇文章主要介紹了JavaWeb開(kāi)發(fā)中的分頁(yè)設(shè)計(jì)和參數(shù)校驗(yàn),分頁(yè)設(shè)計(jì)通過(guò)分頁(yè)查詢參數(shù)優(yōu)化查詢性能,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-02-02
SpringBoot封裝響應(yīng)處理超詳細(xì)講解
這篇文章主要介紹了SpringBoot封裝響應(yīng)處理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2022-12-12
springboot啟動(dòng)過(guò)程中常用的回調(diào)示例詳解
springboot提供非常豐富回調(diào)接口,利用這些接口可以做非常多的事情,本文通過(guò)實(shí)例代碼給大家介紹springboot啟動(dòng)過(guò)程中常用的回調(diào)知識(shí)感興趣的朋友跟隨小編一起看看吧2022-01-01
在navicat中導(dǎo)入mysql數(shù)據(jù)庫(kù)詳細(xì)步驟(即.sql后綴的數(shù)據(jù)庫(kù))
Navicat是MySQL非常好用的可視化管理工具,功能非常強(qiáng)大,能滿足我們?nèi)粘?shù)據(jù)庫(kù)開(kāi)發(fā)的所有需求,下面這篇文章主要給大家介紹了關(guān)于如何在navicat中導(dǎo)入mysql數(shù)據(jù)庫(kù)(即.sql后綴的數(shù)據(jù)庫(kù))的相關(guān)資料,需要的朋友可以參考下2023-04-04
使用MyBatisPlus自動(dòng)生成代碼后tomcat運(yùn)行報(bào)錯(cuò)的問(wèn)題及解決方法
這篇文章主要介紹了使用MyBatisPlus自動(dòng)生成代碼后tomcat運(yùn)行報(bào)錯(cuò)的問(wèn)題及解決方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08
MyBatis SELECT基本查詢實(shí)現(xiàn)方法詳解
這篇文章主要介紹了MyBatis SELECT基本查詢實(shí)現(xiàn)方法詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08
淺析Spring boot 中 logback 配置<springPropert
這篇文章主要介紹了淺析Spring boot 中 logback 配置<springProperty> 讀取application.properties 中的屬性,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-02-02

