成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Arrays.asList這樣用是不對(duì)的

IT那活兒 / 2979人閱讀
Arrays.asList這樣用是不對(duì)的

點(diǎn)擊上方“IT那活兒”,關(guān)注后了解更多精彩內(nèi)容?。?!



 問(wèn)題描述 


在開(kāi)發(fā)中常常需要將數(shù)組轉(zhuǎn)為集合,在本次開(kāi)發(fā)中就用到了Arrays.asList()方法將字符串轉(zhuǎn)為集合。然而向轉(zhuǎn)完之后的集合中添加元素、或者是改變集合結(jié)構(gòu),都會(huì)遇到圖中的問(wèn)題,我一時(shí)間也是很懵逼。
一開(kāi)始我為了排除其他是代碼的問(wèn)題,于是寫個(gè)main方法專門對(duì)Arrarys.asList()方法進(jìn)行測(cè)試。
結(jié)果如下,也是拋出了java.lang.UnsupportedOperationException異常信息。


 問(wèn)題排查 


那么問(wèn)題就來(lái)了:這是為啥呢?

我們順著Arrarys.asList()這個(gè)方法一層一層往里找吧!當(dāng)進(jìn)入這個(gè)方法時(shí),首先我們可以看到方法第一行注釋:Returns a fixed-size list backed by the specified array
這行注釋的大概意思就是:此方法返回一個(gè)基于特定數(shù)組的固定大小集合。
再看看方法結(jié)構(gòu),方法的返回值是我們常見(jiàn)ArrayList。但是這個(gè)卻不是我們常用的那個(gè)Java.util包下的ArrayList。此處的ArrayList是Arrays類的一個(gè)內(nèi)部類。
接著我們看到這個(gè)內(nèi)部類也繼承了AbstractList類,但是只繼承部分方法,沒(méi)有我們常用的ArrayList類中的add()、remove()等方法。
所以當(dāng)我們使用Arrarys.asList()聲明的集合去添加元素或者改變集合結(jié)構(gòu)時(shí),會(huì)拋出java.lang.UnsupportedOperationException異常。
此處可能也是對(duì)應(yīng)了Returns a fixed-size list backed by the specified array這個(gè)注解,所以沒(méi)有寫入add等方法。
這樣常用的方法也是在不經(jīng)意間才會(huì)發(fā)現(xiàn)問(wèn)題,但只要深入研究一下,問(wèn)題很快就能解決,畢竟讀源碼是一個(gè)好習(xí)慣。


 解決方案 


此處,我使用了一個(gè)簡(jiǎn)單的方式去解決這個(gè)問(wèn)題,即使用流處理Collectors.toList()將對(duì)象轉(zhuǎn)換為java.util下ArrayList。功能正常使用,這樣簡(jiǎn)單又方便。如下圖:


 總結(jié) 


雖然Arrays.asList方法不夠完美,但是處理一些對(duì)象轉(zhuǎn)換,使用我們常用的一些contains方法等都是不錯(cuò)的選擇;
但是如add()/remove()/clear()等方法不能使用,只要是修改被Arrays.asList聲明的集合,就會(huì)報(bào)java.lang.UnsupportedOperationException異常。
這也給我們一個(gè)啟發(fā),想要寫出質(zhì)量高的代碼,寫的時(shí)候就得考慮的多一點(diǎn)。


本文作者:李偉業(yè)

本文來(lái)源:IT那活兒(上海新炬王翦團(tuán)隊(duì))


分享

收藏

點(diǎn)贊

在看

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/129663.html

相關(guān)文章

  • JDK 1.8 新特性學(xué)習(xí)(Stream)

    摘要:會(huì)在數(shù)據(jù)源內(nèi)部隱式的遍歷進(jìn)行處理。會(huì)并行遍歷數(shù)據(jù),將數(shù)據(jù)分成若干段,同時(shí)進(jìn)行處理,最終匯總結(jié)果一起輸出。結(jié)束操作會(huì)觸發(fā)實(shí)際計(jì)算,計(jì)算發(fā)生時(shí)會(huì)把所有中間操作積攢的操作以的方式執(zhí)行,這樣可以減少迭代次數(shù)。為函數(shù)式編程而生。 Stream實(shí)現(xiàn)了對(duì)數(shù)據(jù)源的流式處理,它可以并行操作,提高數(shù)據(jù)處理效率。 什么是流 流不是集合,它不對(duì)數(shù)據(jù)做保存,只是最數(shù)據(jù)進(jìn)行算法處理,比如最大值,最小值,排序等操作...

    yhaolpz 評(píng)論0 收藏0
  • 千萬(wàn)不要這樣使用 Arrays.asList !

    摘要:而一開(kāi)始的設(shè)計(jì)時(shí)用于打印數(shù)組而設(shè)計(jì)的,但開(kāi)始,有了另一個(gè)比較更方便的打印函數(shù)于是打印不再使用,而恰巧可用于將數(shù)組轉(zhuǎn)為集合。錯(cuò)誤用法如果你這樣使用過(guò),那你要注意下了。 使用Arrays.asList()的原因無(wú)非是想將數(shù)組或一些元素轉(zhuǎn)為集合,而你得到的集合并不一定是你想要的那個(gè)集合。 而一開(kāi)始asList()的設(shè)計(jì)時(shí)用于打印數(shù)組而設(shè)計(jì)的,但jdk1.5開(kāi)始,有了另一個(gè)比較更方便的打印函數(shù)...

    Nosee 評(píng)論0 收藏0
  • 《Java編程思想》-- 持有對(duì)象 -- 添加一組元素

    摘要:方法接受一個(gè)對(duì)象,以及一個(gè)數(shù)組或是一個(gè)用逗號(hào)分隔的列表,并將元素添加到中。工作的很好,因?yàn)樗麖牡谝粋€(gè)參數(shù)中了解到了目標(biāo)類型是什么。 ArrayList.asList() 接受一個(gè)數(shù)組或是用逗號(hào)分隔的元素列表,也可以用可變參數(shù),然后將其轉(zhuǎn)為一個(gè)List對(duì)象。 Collections.addAll()方法接受一個(gè)Collection對(duì)象,以及一個(gè)數(shù)組或是一個(gè)用逗號(hào)分隔的列表,并將元素添加...

    tomlingtm 評(píng)論0 收藏0
  • 《Java8實(shí)戰(zhàn)》-第五章讀書筆記(使用流Stream-01)

    摘要:跳過(guò)元素流還支持方法,返回一個(gè)扔掉了前個(gè)元素的流。歸約到目前為止,我們見(jiàn)到過(guò)的終端操作都是返回一個(gè)之類的或?qū)ο蟮?。這樣的查詢可以被歸類為歸約操作將流歸約成一個(gè)值。通過(guò)反復(fù)使用加法,你把一個(gè)數(shù)字列表歸約成了一個(gè)數(shù)字。 使用流 在上一篇的讀書筆記中,我們已經(jīng)看到了流讓你從外部迭代轉(zhuǎn)向內(nèi)部迭代。這樣,你就用不著寫下面這樣的代碼來(lái)顯式地管理數(shù)據(jù)集合的迭代(外部迭代)了: /** * 菜單 ...

    OldPanda 評(píng)論0 收藏0
  • Java 8之stream進(jìn)階

    摘要:獲取每個(gè)元素的字符串長(zhǎng)度放入新流中,然后轉(zhuǎn)為類型。歸約歸約就是把整個(gè)流歸約成一個(gè)值的操作,比如求集合中最大的元素所有元素值的和之類的操作。 前言: 上一篇文章 Java 8之stream介紹和使用 中講解了stream的定義和用法,簡(jiǎn)單介紹幾個(gè)最基本最常用的方法,其實(shí)stream還有更強(qiáng)大的功能,這篇文章就會(huì)給大家介紹stream的進(jìn)階用法。 篩選: 在上一篇文章中我們介紹了使用fi...

    Jaden 評(píng)論0 收藏0
  • Java Arrays.asList()與Arrays.sort()分析

    摘要:與分析聲明文章均為本人技術(shù)筆記,轉(zhuǎn)載請(qǐng)注明出處示例源碼將數(shù)組或者指定個(gè)數(shù)的對(duì)象轉(zhuǎn)換為是的內(nèi)部類實(shí)例,與不是一回事,長(zhǎng)度固定,只能遍歷訪問(wèn),不能使用修改集合相關(guān)的方法,比如方法會(huì)拋出異常適配器模式修改數(shù)組內(nèi)容后,內(nèi)容也會(huì)隨之改變,體現(xiàn)適配器模 Java Arrays.asList()與Arrays.sort()分析 聲明 文章均為本人技術(shù)筆記,轉(zhuǎn)載請(qǐng)注明出處https://segment...

    pkhope 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<