
三者轉換核心在於:數組↔List 通過 Arrays.asList / List.toArray;List↔Map 需指定鍵值提取邏輯;數組↔Map 通常經 List 中轉或借助工具類。
package util;
import java.util.*;
import org.apache.commons.collections.MapUtils;
public class Convert {
public static void main(String[] args) {
// 1. 數組 → List
String[] arr = {"123", "456", "789", "123"};
List<String> list = Arrays.asList(arr); // 固定長度列表,不可增刪
// 可變列表:new ArrayList<>(Arrays.asList(arr))
// 2. 數組 → Map (借助 Apache Commons Collections)
// 一維數組:奇數索引為 Key,偶數為 Value;奇數長度最後一個捨棄
Map map = MapUtils.putAll(new HashMap(), arr);
// 二維數組視為多組鍵值對
String[][] ss = {{"a", "b", "e"}, {"c", "d", "f"}};
MapUtils.putAll(map, ss);
// 3. List → 數組
List<String> ls = new ArrayList<>();
ls.add("wch");
ls.add("name");
String[] as = ls.toArray(new String[0]); // 推薦傳入類型化數組
// 4. List → Map (主流流式寫法 Java 8+)
Map<String, Integer> mapFromList = list.stream()
.collect(Collectors.toMap(
k -> k, // Key mapper
v -> v.length(), // Value mapper
(v1, v2) -> v1 // 鍵衝突合併策略
));
// 5. Map → List (鍵集/值集/鍵值對集)
List<String> keyList = new ArrayList<>(map.keySet());
List<Object> valueList = new ArrayList<>(map.values());
List<Map.Entry<String, Object>> entryList = new ArrayList<>(map.entrySet());
// 6. Map → 數組
String[] keys = map.keySet().toArray(new String[0]);
Object[] values = map.values().toArray();
Map.Entry[] entries = map.entrySet().toArray(new Map.Entry[0]);
}
}
| 方向 | 方法 | 陷阱 |
|---|---|---|
| 數組 → List | Arrays.asList(arr) | 返回固定長度 ArrayList,不可 add/remove,需 new ArrayList<>(Arrays.asList(arr)) 複製 |
| List → 數組 | list.toArray(new T[0]) | 傳入 new T[0] 讓 JVM 自動創建精確大小數組,避免反射開銷 |
| 基本類型數組 | 無直接轉換 | int[] 需手動裝箱或用流 Arrays.stream(arr).boxed().collect(...) |
Collectors.toMap 最靈活,需處理鍵重複(合併函數)與空值。keySet()、values()、entrySet() 分別構造對應列表,視圖集合修改會影響原 Map。Apache Commons Collections MapUtils.putAll(map, array) 支持:
[k1, v1, k2, v2...] 交替作為鍵值對。[key, value] 或多值。缺點:語義隱晦,生產環境建議顯式寫入邏輯或使用 Java 8 Stream。
// 數組 → Map (指定鍵值)
String[] data = {"id:1", "name:Tom", "id:2", "name:Jerry"};
Map<String, String> map = Arrays.stream(data)
.map(s -> s.split(":"))
.filter(arr -> arr.length == 2)
.collect(Collectors.toMap(
arr -> arr[0],
arr -> arr[1],
(v1, v2) -> v1 + "," + v2 // 衝突合併
));
// Map → 數組 (值數組)
String[] names = map.values().toArray(new String[0]);
// List → Map (反轉)
Map<String, String> reversed = entryList.stream()
.collect(Collectors.toMap(Map.Entry::getValue, Map.Entry::getKey));
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.2.2</version>
</dependency>
或升級至 org.apache.commons:commons-collections4:4.4(包名變為 org.apache.commons.collections4)。