Java toArray() 方法 的使用
一、toArray()方法簡介
toArray() 是 Java 集合框架中定義在 java.util.Collection 接口里的一個方法,用于將集合轉換為數(shù)組。
方法簽名:
// 無參版本 Object[] toArray(); // 泛型版本(推薦使用) <T> T[] toArray(T[] a);
二、兩種toArray()的區(qū)別
1. 無參toArray()
- 返回一個 Object 類型數(shù)組
- 需要強制類型轉換才能使用具體類型
List<String> list = List.of("Java", "Python", "C++");
Object[] arr = list.toArray();
System.out.println(Arrays.toString(arr));
// 輸出: [Java, Python, C++]
?? 但是如果你想用 String[] 接收,手動轉換:
String[] strArr = (String[]) list.toArray(); // 會報錯 ?
會拋出:
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[]。因為數(shù)組在運行時知道自己的具體類型,反過來不能轉換
2. 帶參數(shù)的toArray(T[] a)(推薦使用)
這個方法允許我們指定返回數(shù)組的類型,是更安全、類型友好的方式。
List<String> list = List.of("Java", "Python", "C++");
String[] arr = list.toArray(new String[0]);
System.out.println(Arrays.toString(arr));
// 輸出: [Java, Python, C++]
推薦寫法:
T[] array = list.toArray(new T[0]);
JDK 11 以后甚至可以這樣寫:
String[] arr = list.toArray(String[]::new);
這種方式使用了 方法引用(Method Reference),更加簡潔高效。
三、toArray(T[] a)方法的內部機制
JDK 源碼(簡化版):
public <T> T[] toArray(T[] a) {
if (a.length < size)
// 如果傳入數(shù)組太小,則創(chuàng)建一個新的同類型數(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ù)組大小不夠,會創(chuàng)建一個新的;
- 若傳入數(shù)組更大,則多余部分置為
null; - 返回的數(shù)組類型與傳入數(shù)組的類型一致。
四、相關案例
示例 1:List 轉數(shù)組
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5); // 推薦寫法 Integer[] numArray = numbers.toArray(new Integer[0]); System.out.println(Arrays.toString(numArray)); // 輸出: [1, 2, 3, 4, 5]
示例 2:Set 轉數(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ù)組大小過小
String[] arr2 = list.toArray(new String[1]); // 會創(chuàng)建新數(shù)組
System.out.println(Arrays.toString(arr2)); // [A, B, C]
// 數(shù)組大小過大
String[] arr3 = list.toArray(new String[5]);
System.out.println(Arrays.toString(arr3)); // [A, B, C, null, null]
五、數(shù)組轉集合(反向操作)
除了 toArray(),我們也常常需要把數(shù)組變成集合,可以使用:
String[] arr = {"A", "B", "C"};
List<String> list = Arrays.asList(arr);
System.out.println(list); // [A, B, C]
?? 注意:Arrays.asList() 返回的是一個定長列表,不能添加或刪除元素。
如果需要可變集合:
List<String> list = new ArrayList<>(Arrays.asList(arr));
list.add("D"); // ?
六、常見錯誤與注意事項 ??
| 錯誤場景 | 問題說明 | 正確做法 |
|---|---|---|
| (String[]) list.toArray() | 會拋出類型轉換異常 | list.toArray(new String[0]) |
| 數(shù)組大小過小 | 自動創(chuàng)建新數(shù)組 | ? 安全 |
| 數(shù)組大小過大 | 多余部分會置 null | 注意空指針判斷 |
| 修改數(shù)組不影響集合 | 二者是獨立的 | toArray() 復制數(shù)據(jù) |
| Arrays.asList() 不可添加刪除元素 | 固定長度 | 用 new ArrayList<>(...) |
七、性能小貼士
- 對于頻繁轉換的場景(尤其是大集合),建議使用:
list.toArray(new String[list.size()]);
避免額外的數(shù)組分配操作。
- 對于小集合或不確定大小,推薦:
list.toArray(new String[0]);
更簡潔、安全。
JVM 對 new T[0] 模式已有優(yōu)化(JDK 11+ 性能與預分配數(shù)組幾乎無差異)。
八、總結表
| 方法 | 返回類型 | 是否安全 | 適用場景 |
|---|---|---|---|
| toArray() | Object[] | 否(需強轉) | 快速調試或簡單場景 |
| toArray(T[] a) | T[] | ? 是 | 泛型集合轉換 |
| toArray(String[]::new) | T[] | ? 推薦 | Java 11+ 優(yōu)雅寫法 |
到此這篇關于Java toArray() 方法 的使用的文章就介紹到這了,更多相關Java toArray() 內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java使用百度AI接口實現(xiàn)智能機器人對話系統(tǒng)
AI已經(jīng)在各行各業(yè)中廣泛應用,助力于各式各樣的業(yè)務,而在機器人對話中,我們可以通過利用百度AI中的自然語言處理、問答知識圖譜等技術,使機器人可以更加智能化、自然化的為用戶服務,本文介紹Java利用百度AI接口實現(xiàn)智能機器人對話系統(tǒng)2024-01-01
RocketMQ之NameServer架構設計及啟動關閉流程源碼分析
這篇文章主要為大家介紹了RocketMQ之NameServer架構設計及啟動關閉流程源碼分析詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步2021-11-11

