欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

Java如何遍歷集合并把其中的某些元素刪除

本篇內(nèi)容介紹了“Java如何遍歷集合并把其中的某些元素刪除”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

成都創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),莫力達(dá)企業(yè)網(wǎng)站建設(shè),莫力達(dá)品牌網(wǎng)站建設(shè),網(wǎng)站定制,莫力達(dá)網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷(xiāo),網(wǎng)絡(luò)優(yōu)化,莫力達(dá)網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專(zhuān)業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。

本文基于jdk1.8來(lái)分析ArrayList的源碼

首先是主要的成員變量。

  /**
   * Default initial capacity.
   **/
  private static final int DEFAULT_CAPACITY = 10;
  /**
   * Shared empty array instance used for empty instances.
   **/
  private static final Object[] EMPTY_ELEMENTDATA = {};
  /**
   * Shared empty array instance used for default sized empty instances. We
   * distinguish this from EMPTY_ELEMENTDATA to know how much to inflate when
   * first element is added.
   **/
  private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
  /**
   * The array buffer into which the elements of the ArrayList are stored.
   * The capacity of the ArrayList is the length of this array buffer. Any
   * empty ArrayList with elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA
   * will be expanded to DEFAULT_CAPACITY when the first element is added.
   **/
  transient Object[] elementData; // non-private to simplify nested class access
  /**
   * The size of the ArrayList (the number of elements it contains).
   *
   * @serial
   **/
  private int size;

其中初始大小為10,size表示集合中元素的個(gè)數(shù)。此外,還有兩個(gè)空數(shù)組EMPTY_ELEMENTDATA,和DEFAULTCAPACITY_EMPTY_ELEMENTDATA。通過(guò)DEFAULTCAPACITY_EMPTY_ELEMENTDATA的注釋?zhuān)覀兛梢粤私獾?,這個(gè)變量區(qū)別于EMPTY_ELEMENTDATA,主要是為了決定第一個(gè)元素插入時(shí),擴(kuò)容多大的問(wèn)題。從這里的描述可以理解到,ArrayList創(chuàng)建好后,其實(shí)并沒(méi)有真正分配數(shù)組空間,而是在第一個(gè)元素插入時(shí),才分配的空間。這一點(diǎn)是區(qū)別于jdk1.6的。在jdk1.6中,ArrayList一創(chuàng)建,數(shù)據(jù)空間就默認(rèn)分配好了,10個(gè)或指定的空間。jdk1.8這么做,可以做到空間延遲分配,提高程序性能。

接下來(lái)看一下構(gòu)造函數(shù)。

/**
   * Constructs an empty list with an initial capacity of ten.
   **/
  public ArrayList() {
    this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
  }
/**
   * Constructs an empty list with the specified initial capacity.
   *
   * @param initialCapacity the initial capacity of the list
   * @throws IllegalArgumentException if the specified initial capacity
   *     is negative
   **/
  public ArrayList(int initialCapacity) {
    if (initialCapacity > 0) {
      this.elementData = new Object[initialCapacity];
    } else if (initialCapacity == 0) {
      this.elementData = EMPTY_ELEMENTDATA;
    } else {
      throw new IllegalArgumentException("Illegal Capacity: "+
                        initialCapacity);
    }
  }

無(wú)參構(gòu)造函數(shù),將創(chuàng)建一個(gè)長(zhǎng)度為0的空數(shù)組。

有參構(gòu)造函數(shù),參數(shù)大于0時(shí)正常創(chuàng)建數(shù)組,參數(shù)為0時(shí),也是創(chuàng)建長(zhǎng)度為0的數(shù)組。但它和無(wú)參構(gòu)造函數(shù)創(chuàng)建的空數(shù)組是可以區(qū)別開(kāi)的,它們使用了不同的對(duì)象。

接下來(lái)是插入元素add。

/**
   * Appends the specified element to the end of this list.
   *
   * @param e element to be appended to this list
   * @return <tt>true</tt> (as specified by {@link Collection#add})
   **/
  public boolean add(E e) {
    ensureCapacityInternal(size + 1); // Increments modCount!!
    elementData[size++] = e;
    return true;
  }
 private void ensureCapacityInternal(int minCapacity) {
    ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
  }
 private static int calculateCapacity(Object[] elementData, int minCapacity) {
    if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
      return Math.max(DEFAULT_CAPACITY, minCapacity);
    }
    return minCapacity;
  }
 private void ensureExplicitCapacity(int minCapacity) {
    modCount++;
    // overflow-conscious code
    if (minCapacity - elementData.length > 0)
      grow(minCapacity);
  }

通過(guò)calculateCapacity函數(shù),我們可以知道,如果是用new ArrayList()創(chuàng)建的list,第一次add元素,計(jì)算得minCapacity = 1。如果是new ArrayList(0)創(chuàng)建的list,計(jì)算得minCapacity = 10. 然后再根據(jù)minCapacity去grow。

get方法比較簡(jiǎn)單,這里不再分析。

ArrayList的一個(gè)常見(jiàn)問(wèn)題是ConcurrentModificationException,同步修改異常,也稱(chēng)為快速失敗,fast-fail。當(dāng)我們以foreach方式遍歷ArrayList時(shí),如果在遍歷過(guò)程中刪除ArrayList的元素,或者別的線程往ArrayList中添加元素,就會(huì)拋出該異常。這里需要注意,以for(int i = 0; i < list.size(); i++)的方式遍歷ArrayList時(shí),是不會(huì)拋出同步修改異常的,但用這種方式遍歷,需要處理好i的前進(jìn)速度。

那么,用foreach方式遍歷ArrayList為什么會(huì)拋出同步修改異常呢?

foreach代碼的底層實(shí)現(xiàn),是用iterator對(duì)ArrayList進(jìn)行遍歷,在遍歷過(guò)程中,會(huì)持續(xù)調(diào)用next獲取下一個(gè)元素。next方法中,會(huì)首先checkForComodification(),它的作用是檢查modCount和expectedModCount是否相等。不相等時(shí),則拋出同步修改異常。那么什么情況下修改次數(shù)和期望修改次數(shù)不相等呢?這里需要首先弄明白,modCount和expectedModCount是什么東西?modCount是ArrayList從它的父類(lèi)繼承來(lái)的屬性,記錄了集合的修改次數(shù),add,remove時(shí)都會(huì)給modCount加1. expectedModCount是迭代器的成員變量,它是在創(chuàng)建迭代器時(shí),取的modCount的值,并且,在遍歷過(guò)程中不再改變。那么就清楚了,expectedModCount其實(shí)是開(kāi)始遍歷時(shí)modCount的值,如果在遍歷過(guò)程中,ArrayList進(jìn)行了add或remove操作,那么必然導(dǎo)致expectedModCount和modCount不相等,于是就拋出了同步修改異常。

public E next() {
      checkForComodification();
      int i = cursor;
      if (i >= size)
        throw new NoSuchElementException();
      Object[] elementData = ArrayList.this.elementData;
      if (i >= elementData.length)
        throw new ConcurrentModificationException();
      cursor = i + 1;
      return (E) elementData[lastRet = i];
    }
    final void checkForComodification() {
      if (modCount != expectedModCount)
        throw new ConcurrentModificationException();
    }

那么,同步修改異常如何避免呢?或者說(shuō),我們?nèi)绾伪闅v集合并把其中的某些元素刪除呢?

答案是使用迭代器的remove方法刪除元素。在迭代器的remove方法中,刪除元素后,會(huì)重新把modCount賦值給expectedModCount,所以,它不會(huì)拋出同步修改異常。

 public void remove() {
      if (lastRet < 0)
        throw new IllegalStateException();
      checkForComodification();
      try {
        ArrayList.this.remove(lastRet);
        cursor = lastRet;
        lastRet = -1;
        expectedModCount = modCount;
      } catch (IndexOutOfBoundsException ex) {
        throw new ConcurrentModificationException();
      }
    }

“Java如何遍歷集合并把其中的某些元素刪除”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

分享文章:Java如何遍歷集合并把其中的某些元素刪除
標(biāo)題URL:http://aaarwkj.com/article20/pjdgco.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供移動(dòng)網(wǎng)站建設(shè)、響應(yīng)式網(wǎng)站網(wǎng)站導(dǎo)航、靜態(tài)網(wǎng)站、云服務(wù)器虛擬主機(jī)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)公司
亚洲欧洲久久激情久av| 一区二区三区av天堂| 亚州无吗一区二区三区| 一区二区三区国产精品乱码| 91黄色国产在线播放| 国产91黑丝视频在线观看| 亚洲国产精品自拍视频| 欧美午夜一级特黄大片| 亚洲中文字幕精品视频乱码| 欧美大片黄片在线观看| 青青草免费在线视频视频| 曰韩av毛片在线观看| 本色啪啪人妻夜嗨嗨av| 国产精品三级高清在线| 欧美亚洲综合日韩精品区| 中文字幕免费不卡一区| 持续侵犯人妻中文字幕| 东京一区二区三区四区黄片| 亚洲国产成人精品女人| 小骚货操死你视频在线观看| 亚洲午夜精品日韩乱码| 中文字幕在线日韩av| 国产亚洲精品久久久9| 97视频观看免费观看| 欧美日韩一区二区综合性色| 欧美日韩一级一区二区三区| 亚洲熟女熟妇另类中文| 欧美香蕉视频播放二区| 欧美亚洲尤物久久精品| 黑人巨大欧美一区二区| 国产精品久久高清免费| 亚洲人成伊人久久成| 日日嗨av特一级黄淫片| 91日本视频在线播放| 日本在线免费成人高清| 日韩久久精品国产亚洲av成人| 国产av蜜臀一区二区三区| 2022国产精品一区| 亚洲精品一区二区成人影院| 伊人亚洲一区二区三区| 国产精品亚洲欧美在线|