日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
Java中,Arrays轉(zhuǎn)List的那些坑

 一、前言

目前創(chuàng)新互聯(lián)建站已為上1000+的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)頁(yè)空間、網(wǎng)站托管、服務(wù)器托管、企業(yè)網(wǎng)站設(shè)計(jì)、永濟(jì)網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。

如果有對(duì)于一些 Array 到 List 轉(zhuǎn)換的需要的話,可能就需要用到 Arrays 這個(gè)類,它除了提供一些對(duì)數(shù)組的排序和搜索等操作之外,還提供了一些從 Array.asList() 這個(gè)非常方便的將 Array 轉(zhuǎn)為 List 的 Api ,但是它使用起來也有一些需要注意的地方。

本篇就簡(jiǎn)單介紹一下使用 Arrays 的一些注意事項(xiàng)。

二、需要注意什么

1、asList() 無法將基本類型轉(zhuǎn)換為L(zhǎng)ist

asList() 可以將一個(gè)數(shù)組轉(zhuǎn)換為我們需要的 List。但是如果這個(gè)數(shù)組是一個(gè)基本數(shù)據(jù)類型的話,就會(huì)出現(xiàn)問題。

舉個(gè)例子:

最終輸出的結(jié)果是:

 
 
 
 
  1. I/cxmyDev: list size : 1 

這個(gè)結(jié)果和我們的預(yù)期是不符合的,先來看看 asList() 的實(shí)現(xiàn)源碼。

可以看到 asList() 是接受一個(gè)泛型的變長(zhǎng)參數(shù)的,而基本數(shù)據(jù)類型是無法被泛型化的。而對(duì)于泛型而言,基本數(shù)據(jù)類型,實(shí)際上會(huì)被人為是一個(gè) [x 的類型。 [ 表示這是一個(gè)數(shù)組,x 為當(dāng)前數(shù)組的類型。例如: int[] 實(shí)際上它的類型是 [I 。

舉個(gè)例子來說明問題。

 
 
 
 
  1. I/cxmyDev: list size : 1 
  2. I/cxmyDev: list.get(0) class : [I 
  3. I/cxmyDev: list type : true 

可以看到,確實(shí)與前面介紹的一致。

所以,得出的結(jié)論就是,8 種基本數(shù)據(jù)類型,不能被用在方法的泛型變長(zhǎng)參數(shù)中,否者會(huì)被人為是一個(gè) [X 類型的參數(shù),而不是可變長(zhǎng)參數(shù)。

有時(shí)候又需要對(duì)這些基本數(shù)據(jù)類型進(jìn)行操作,這個(gè)時(shí)候,就可以使用基本數(shù)據(jù)類型的包裝類。

簡(jiǎn)單改寫一個(gè)上面的 Demo。

再來看看輸出的結(jié)果,驗(yàn)證結(jié)果。

 
 
 
 
  1. list size : 6  
  2. I/cxmyDev: list.get(0) class : java.lang.Integer  
  3. I/cxmyDev: list type :false 

這樣使用,就和我們的預(yù)期是一樣的了。

2、asList() 返回的列表是不可變的

前面看了 asList() 的方法簽名,可以發(fā)現(xiàn),它返回的是一個(gè) ArrayList 。但是,需要注意的是,這個(gè) ArrayList ,并不是我們經(jīng)常使用的 ArrayList ,我們經(jīng)常使用的 ArrayList 是屬于java.util 包下面的,而 asList() 返回的只是 Arrays 的一個(gè)內(nèi)部類。

雖然他們同為 ArrayList 但是從實(shí)現(xiàn)和文檔上都可以看到,Arrays.ArrayList() 是一個(gè)不可改變的 List。它雖然也是繼承自 AbstractList ,但是它只實(shí)現(xiàn)了一部分方法,并沒有實(shí)現(xiàn)其中的 add() 、remove() 等用于操作 ArrayList 的方法。

例如上面的代碼,想在 asList() 返回的List 中,再插入一條數(shù)據(jù),將會(huì)拋出UnsupportedOperationException 這個(gè)異常。

UnsupportedOperationException 這個(gè)異常,是在 AbstractList.add() 方法中拋出的。

可以看到,如果繼承了 AbstractList 而不去實(shí)現(xiàn)它對(duì)應(yīng)的方法,調(diào)用就會(huì)拋出此異常。

如果需要使用 asList() 方法的話,就需要確保轉(zhuǎn)換出來的 List 將不會(huì)再被修改,否者會(huì)拋出異常。

而如果想對(duì) Arrays.asList() 轉(zhuǎn)換的 ArrayList 做操作,就需要再一次對(duì)其進(jìn)行轉(zhuǎn)換。

三、小結(jié)

Arrays.asList() 使用的坑基本上都已經(jīng)說清楚了,并且也提供了解決的辦法。

【本文為專欄作者“張旸”的原創(chuàng)稿件,轉(zhuǎn)載請(qǐng)通過微信公眾號(hào)聯(lián)系作者獲取授權(quán)】


網(wǎng)站標(biāo)題:Java中,Arrays轉(zhuǎn)List的那些坑
本文來源:http://www.5511xx.com/article/dpjgchc.html