集合轉(zhuǎn)數(shù)組 ?: ?大家想馬上想到的應(yīng)該是toArray方法 ?,但List 復(fù)寫了多個(gè)toArry方法,,不知道看官平時(shí)用的是那個(gè)
個(gè)人推薦 使用? 使用 toArray(T[] array) 傳入的參數(shù)是類型完全一樣的數(shù)組,大小就是list.size(). ?
? ? ? ? 分析:使用toArray帶參方法,入?yún)⒎峙涞臄?shù)組空間不夠大時(shí),toArray方法內(nèi)部將重新分配內(nèi)存空間,并返回新數(shù)組地址 ; 如果元素大于實(shí)際所需,
? ? ? ? ? 下標(biāo)為[list.size()]的數(shù)組元素將被置為null,其他元素保持原值,因此最好將方法入?yún)?shù)組大小定義與集合元素一致.
? ? List list = new ArrayList(2);
? ? list.add("hello");
? ? list.add("world");
? ? String[] array = new String[list.size()];
? ? ?array = list.toArray(array);
不推薦使用 toArray() 無(wú)參方法,,,直接使用toArray無(wú)參方法存在問(wèn)題,此方法返回值只能是Object[]類,若強(qiáng)轉(zhuǎn)其它
類型數(shù)組將出現(xiàn)ClassCastException錯(cuò)誤。
數(shù)組轉(zhuǎn)集合 ? 常用方法 Arrays.asList(), 但你是否知道調(diào)用此方法返回的List類型不能執(zhí)行相關(guān)修改的方法比如add/remove/clear ?執(zhí)行的時(shí)候會(huì)報(bào)錯(cuò) UnsupportOperationException 不支持的操作異常,這又是why?
分析如下:
結(jié)果 ?調(diào)用get方法是正常的,,在執(zhí)行remove 方法的時(shí)候報(bào)錯(cuò)的 ,,
分析 :
? ?進(jìn)入Arrays.asList()方法觀看源碼
此時(shí) asList 方法中直接 ?new ArrayList ()返回 ? ,再看下方代碼發(fā)現(xiàn)了一個(gè)內(nèi)部類ArrayList ?
在內(nèi)部類的構(gòu)造函數(shù) ArrayList()中 ?返回的是一個(gè)數(shù)組.
所以 asList 返回的ArrayList 和java.util包中的ArrayList 不是同一個(gè)類 ,,
Arrays中的內(nèi)部類ArrayList 繼承了AbstractList ,,而AbstractList 是接口List 實(shí)現(xiàn)
所有 在返回后的List 集合是AbstractList 的子類ArrayList(Arrays的一個(gè)內(nèi)部類)的實(shí)例, 那調(diào)用的remove 方法也是在這個(gè)類中的實(shí)現(xiàn)
但其實(shí)這個(gè)內(nèi)部類ArrayList本身只重寫get方法,而沒(méi)有重寫remove這個(gè)方法,,是繼承與分類AbstractList 中的remove方法
查看 AbstractList?
? 瞬間 豁然開(kāi)朗了 ...
總結(jié)一下 ,,asList的返回對(duì)象是一個(gè)Arrays內(nèi)部類,并沒(méi)有實(shí)現(xiàn)集合的修改方法。Arrays.asList
中體現(xiàn)的是適配器模式,只是轉(zhuǎn)換接口,后臺(tái)的數(shù)據(jù)仍是數(shù)組