Java之HashMap.values()轉(zhuǎn)List時的錯誤和正確演示
HashMap.values()轉(zhuǎn)List時的錯誤和正確演示
因為項目中需要獲取到Map的值的集合,所以調(diào)用了HashMap.values()方法轉(zhuǎn)成List,當時是使用了以下代碼。
(邏輯上這樣想應(yīng)該沒問題,但生活總是會是不是給你一點小“”驚喜“”)
List<AreaItemOpt> areaItemOpts = (List<AreaItemOpt>) areaItemOptMap.values(); return areaItemOpts;
懷著喜悅的心情在測試環(huán)境中運行之后,它報錯了!
報錯如下:
java.lang.ClassCastException: java.util.HashMap$Values cannot be cast to java.util.List

錯誤原因
于是翻了一下values()方法的源碼
public Collection<V> values() {
Collection<V> vs = values;
return (vs != null ? vs : (values = new Values()));
}
原來values()方法只是返回了一個Collection集合,可是如程序中的用法所示,在向下轉(zhuǎn)型的時候出現(xiàn)了類型轉(zhuǎn)換錯誤。
解決方法
在ArrayList中,有一個構(gòu)造函數(shù)
public ArrayList(Collection<? extends E> c) {
elementData = c.toArray();
if ((size = elementData.length) != 0) {
// c.toArray might (incorrectly) not return Object[] (see 6260652)
if (elementData.getClass() != Object[].class)
elementData = Arrays.copyOf(elementData, size, Object[].class);
} else {
// replace with empty array.
this.elementData = EMPTY_ELEMENTDATA;
}
}
可以接受一個集合類型的參數(shù),然后返回一個list;這樣就達到了預(yù)期目的。
代碼如下:
List<AreaItemOpt> areaItemOpts = new ArrayList<>(areaItemOptMap.values()); return areaItemOpts;
測試通過~

發(fā)現(xiàn)還有一種方法也可以解決這個問題:
List<T> list=(List<T>) Arrays.asList(map.values().toArray());//先轉(zhuǎn)數(shù)組再轉(zhuǎn)list
Map的Value值轉(zhuǎn)換為List集合
不多廢話,直接看代碼,有注解
public class Map轉(zhuǎn)List {
? ? public static void main(String[] args) {
? ? ? ? //開辟空間
? ? ? ? HashMap<Integer,String> hashMap = new HashMap<Integer,String>();
? ? ? ? //存入數(shù)據(jù)
? ? ? ? hashMap.put(1,"張三");
? ? ? ? hashMap.put(2,"李四");
? ? ? ? hashMap.put(3,"王五");
? ? ? ? //使用Collection類型接收HashMap的Value值
? ? ? ? Collection<String> collection = hashMap.values();
? ? ? ? //把Collection對象作為參數(shù)傳入ArrayList構(gòu)造方法完成類型轉(zhuǎn)換
? ? ? ? ArrayList<String> arrayList = new ArrayList<String>(collection);
? ? ? ? //輸出測試
? ? ? ? System.out.println(arrayList.toString());
? ? }
}總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
java的springboot實現(xiàn)將base64編碼轉(zhuǎn)換pdf
在Spring Boot中,將Base64編碼的字符串轉(zhuǎn)換為PDF文件并導(dǎo)出到客戶端,通常涉及幾個步驟:首先將Base64字符串解碼為字節(jié)數(shù)組,然后使用這些字節(jié)數(shù)據(jù)來創(chuàng)建PDF文件,并最終通過HTTP響應(yīng)將其發(fā)送給客戶端2024-08-08
java并發(fā)編程專題(十一)----(JUC原子類)數(shù)組類型詳解
這篇文章主要介紹了JAVA JUC原子類 數(shù)組類型詳解的相關(guān)資料,文中示例代碼非常詳細,幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-07-07
springMVC如何將controller中Model數(shù)據(jù)傳遞到j(luò)sp頁面
本篇文章主要介紹了springMVC如何將controller中Model數(shù)據(jù)傳遞到j(luò)sp頁面,具有一定的參考價值,有興趣的可以了解一下2017-07-07
java基于servlet使用組件smartUpload實現(xiàn)文件上傳
這篇文章主要介紹了java基于servlet使用組件smartUpload實現(xiàn)文件上傳,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-10-10
Spring Security異步無法獲取用戶認證信息的解決方法
最近使用 Springboot 中 @Async 注解異步調(diào)用方法時,發(fā)現(xiàn)無法獲取到用戶認證信息,本文小編給大家介紹了Spring Security異步無法獲取用戶認證信息的原因和解決方法,并通過代碼示例介紹的非常詳細,需要的朋友可以參考下2024-09-09
一文了解SpringBoot是如何連接數(shù)據(jù)庫的
Spring Boot提供了一系列的開箱即用的功能和特性,使得開發(fā)人員可以快速構(gòu)建和部署應(yīng)用程序,下面這篇文章主要給大家介紹了關(guān)于SpringBoot是如何連接數(shù)據(jù)庫的相關(guān)資料,需要的朋友可以參考下2023-06-06
Java實現(xiàn)用Freemarker完美導(dǎo)出word文檔(帶圖片)
這篇文章主要介紹了Java實現(xiàn)用Freemarker完美導(dǎo)出word文檔(帶圖片),具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-07-07

