亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

Arrays.asList這樣用是不對的

IT那活兒 / 3022人閱讀
Arrays.asList這樣用是不對的

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



 問題描述 


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


 問題排查 


那么問題就來了:這是為啥呢?

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


 解決方案 


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


 總結(jié) 


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


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

本文來源:IT那活兒(上海新炬王翦團隊)


分享

收藏

點贊

在看

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

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/129663.html

相關(guān)文章

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

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

    yhaolpz 評論0 收藏0
  • 千萬不要這樣使用 Arrays.asList !

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

    Nosee 評論0 收藏0
  • 《Java編程思想》-- 持有對象 -- 添加一組元素

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

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

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

    OldPanda 評論0 收藏0
  • Java 8之stream進階

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

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

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

    pkhope 評論0 收藏0

發(fā)表評論

0條評論

IT那活兒

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<