欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Java 集合類 List 的那些坑

 更新時(shí)間:2020年08月23日 15:56:25   作者:mghio  
這篇文章主要介紹了Java 集合類 List 的那些坑,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

現(xiàn)在的一些高級(jí)編程語言都會(huì)提供各種開箱即用的數(shù)據(jù)結(jié)構(gòu)的實(shí)現(xiàn),像 Java 編程語言的集合框架中就提供了各種實(shí)現(xiàn),集合類包含 Map 和 Collection 兩個(gè)大類,其中 Collection 下面的 List 列表是我們經(jīng)常使用的集合類之一,很多的業(yè)務(wù)代碼都離不開它,今天就來看看 List 列表的一些坑。

第一個(gè)坑:Arrays.asList 方法返回的 List 不支持增加、刪除操作

例如我們執(zhí)行以下代碼:

List<String> strings = Arrays.asList("m", "g");
strings.add("h");

會(huì)拋出 java.lang.UnsupportedOperationException 異常,此時(shí)你內(nèi)心 OS what?明明返回的 ArrayList 為啥不能往里面增加元素,這以后還能好好的增加元素嗎? ,然后果斷開啟 Debug 大法:

發(fā)現(xiàn)返回的 ArrayList 并不是我們常用的 java.util.ArrayList ,而是 Arrays 的內(nèi)部類 java.util.Arrays.ArrayList 。進(jìn)入方法 Arrays.asList 源碼如下:

public static <T> List<T> asList(T... a) {
  return new ArrayList<>(a);
}

方法返回的是 Arrays 的靜態(tài)內(nèi)部類 java.util.Arrays.ArrayList ,該類雖然和 java.util.ArrayList 也繼承自抽象類 java.util.AbstractList ,但是通過該類的源碼發(fā)現(xiàn)它并沒有對(duì)抽象父類 AbstractListadd 方法默認(rèn)就是拋出 java.lang.UnsupportedOperationException 異常。

這個(gè)坑的根本原因是我們調(diào)用返回的 stringsadd 方法是繼承自抽象父類的 add 方法,而抽象父類的方法默認(rèn)就是拋出 java.lang.UnsupportedOperationException 這個(gè)異常。

第二個(gè)坑,Arrays.asList 方法返回的新 List 和該方法原始入?yún)?shù)組修改會(huì)相互影響

Arrays.asList 方法除了上面這個(gè) 不支持增加、刪除元素 這個(gè)坑之外,還有另外一個(gè)坑:

從以上代碼可以發(fā)現(xiàn),對(duì)原始數(shù)組的修改會(huì)影響我們通過 Arrays.asList 方法獲得的新 List ,深入 java.util.Arrays.ArrayList 的源碼:

private static class ArrayList<E> extends AbstractList<E>
    implements RandomAccess, java.io.Serializable
  {
    private static final long serialVersionUID = -2764017481108945198L;
    private final E[] a;

    ArrayList(E[] array) {
      a = Objects.requireNonNull(array);
    }
    
    ...
    
   }  

可以發(fā)現(xiàn)是直接使用了原始的數(shù)組,所有當(dāng)我們使用 Arrays.asList 方式獲得的 List 時(shí)要特別注意,因?yàn)楣蚕砹藬?shù)組,相互修改時(shí)可能產(chǎn)生一些意想不到的 Bug。標(biāo)準(zhǔn)的姿勢(shì)之一是將其作為 ArrayList 構(gòu)造方法的參數(shù)重新 new 一個(gè) List 出來即可(e.g. List<String> stringList = new ArrayList<>(Arrays.asList(arrays)) )或者通過 Guava 庫中的 Lists.newArrayList ,將返回的新 List 和原始的數(shù)組解耦,就不會(huì)再互相影響了。

第三個(gè)坑,直接遍歷 List 集合刪除元素會(huì)報(bào)錯(cuò)

在直接遍歷集合元素時(shí)增加、刪除元素會(huì)報(bào)錯(cuò),比如執(zhí)行如下代碼:

List<String> stringList = Lists.newArrayList("m", "g", "h");
for (String s : stringList) {
  if (Arrays.asList("m", "h").contains(s)) {
    stringList.remove(s);
  }
}

以上代碼可以正常編譯通過,但是執(zhí)行時(shí)會(huì)拋出 java.util.ConcurrentModificationException 異常,查看其源碼可以發(fā)現(xiàn),刪除元素方法 remove 會(huì)使集合結(jié)構(gòu)發(fā)生修改,也就是 modCount( 集合實(shí)際修改的次數(shù))會(huì)修改,在循環(huán)過程中,會(huì)比較當(dāng)前 List 的集合實(shí)際修改的次數(shù) modCount 與迭代器修改的次數(shù) expectedModCount ,而 expectedModCount 是初始化時(shí)的 modCount , 二者不相等,就會(huì)報(bào) ConcurrentModificationException 異常。解決方法主要有兩種方式,1.使用 ArrayList 的迭代器方式遍歷,然后調(diào)用其中的方法。2.在 JDK 1.8+ 可以使用 removeIf 方法進(jìn)行刪除操作。

最后扎心一問:調(diào)用 ArrayListremove 方法傳入 int 基本類型的數(shù)字和 Integer 包裝類型的數(shù)字,執(zhí)行結(jié)果是不是一樣的?

到此這篇關(guān)于詳解Java 集合類 List 的那些坑的文章就介紹到這了,更多相關(guān)Java List集合類坑 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring七大事務(wù)傳遞機(jī)制深入分析實(shí)現(xiàn)原理

    Spring七大事務(wù)傳遞機(jī)制深入分析實(shí)現(xiàn)原理

    實(shí)際項(xiàng)目開發(fā)中,如果涉及到多張表操作時(shí),為了保證業(yè)務(wù)數(shù)據(jù)的一致性,大家一般都會(huì)采用事務(wù)機(jī)制,好多小伙伴可能只是簡(jiǎn)單了解一下,遇到事務(wù)失效的情況,便會(huì)無從下手,下面這篇文章主要給大家介紹了關(guān)于Spring事務(wù)傳遞機(jī)制的相關(guān)資料,需要的朋友可以參考下
    2023-03-03
  • IDEA下"File is read-only"可能原因分析及"找不到或無法加載主類"的問題

    IDEA下"File is read-only"可能原因分析及"找不到

    這篇文章主要介紹了IDEA下"File is read-only"可能原因分析及"找不到或無法加載主類"的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-05-05
  • Java中static靜態(tài)變量的初始化完全解析

    Java中static靜態(tài)變量的初始化完全解析

    static所聲明的變量在Java中有一個(gè)初始化的先后順序,帶著這個(gè)問題接下來我們就來進(jìn)行Java中static靜態(tài)變量的初始化完全解析:
    2016-06-06
  • spring boot 加載web容器tomcat流程源碼分析

    spring boot 加載web容器tomcat流程源碼分析

    本文章主要描述spring boot加載web容器 tomcat的部分,為了避免文章知識(shí)點(diǎn)過于分散,其他相關(guān)的如bean的加載,tomcat內(nèi)部流程等不做深入討論,具體內(nèi)容詳情跟隨小編一起看看吧
    2021-06-06
  • 15個(gè)高級(jí)Java多線程面試題及回答

    15個(gè)高級(jí)Java多線程面試題及回答

    這篇文章主要介紹了15個(gè)高級(jí)Java多線程面試題及回答,翻譯自國外的一篇文章,這些面試題容易混淆、較難回答,需要的朋友可以參考下吧
    2014-05-05
  • SpringBoot的ConfigurationProperties或Value注解無效問題及解決

    SpringBoot的ConfigurationProperties或Value注解無效問題及解決

    在SpringBoot項(xiàng)目開發(fā)中,全局靜態(tài)配置類讀取application.yml或application.properties文件時(shí),可能會(huì)遇到配置值始終為null的問題,這通常是因?yàn)樵趧?chuàng)建靜態(tài)屬性后,IDE自動(dòng)生成的Get/Set方法包含了static關(guān)鍵字
    2024-11-11
  • java實(shí)現(xiàn)歸并排序算法

    java實(shí)現(xiàn)歸并排序算法

    在學(xué)習(xí)算法的過程中,我們難免會(huì)接觸很多和排序相關(guān)的算法。總而言之,對(duì)于任何編程人員來說,基本的排序算法是必須要掌握的。那么現(xiàn)在我們將要進(jìn)行基本的歸并排序算法的講解
    2016-01-01
  • SpringSecurity詳解整合JWT實(shí)現(xiàn)全過程

    SpringSecurity詳解整合JWT實(shí)現(xiàn)全過程

    JWT作為一個(gè)開放的標(biāo)準(zhǔn)(?RFC?7519?),定義了一種簡(jiǎn)潔的,自包含的方法用于通信雙方之間以Json對(duì)象的形式安全的傳遞信息。接下來通過本文給大家介紹springSecurity+jwt實(shí)現(xiàn)互踢功能,需要的朋友可以參考下
    2022-07-07
  • IDEA如何將右下角提示框禁止彈出問題

    IDEA如何將右下角提示框禁止彈出問題

    這篇文章主要介紹了IDEA如何將右下角提示框禁止彈出問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • volatile與happens-before的關(guān)系與內(nèi)存一致性錯(cuò)誤

    volatile與happens-before的關(guān)系與內(nèi)存一致性錯(cuò)誤

    本文講了Java并發(fā)編程中volatile變量、happens-before與內(nèi)存一致性錯(cuò)誤,下面來和小編一起學(xué)習(xí)下如何解決
    2019-05-05

最新評(píng)論