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

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è)公司
亚洲欧美另类熟女丝袜| 国产在线拍揄自揄视频不卡99| 亚洲综合久久五月天| 国产成人免费高清av| 99精品欧美一区二区三区视频| 日本人妻精品一区二区| 92午夜福利精品视频| 成熟人妻中文字幕在线看| 中文字幕精品久久久人妻| 国产免费看黄色的网站| 亚洲一区二区三区观看视频| 亚洲国产传媒在线观看| 亚洲国产精品伦理在线看| 男女啪啪国产精品视频| 91精品国产自产在线观看| 日韩暴露一区二区三区| 亚洲日本一区二区三区电影| 亚洲黄色av网址在线观看| 欧美在线日韩一区二区| 欧美精品一区二区三区黄片| 国产一区二区乱码在线| 久久久久久国产精彩视频| 亚洲av乱码毛片在线播放| 国产成人精品高清国产三级| 日本久久高清免费观看| 国产精品成久久久久三级| 国产无遮挡的免费视频| 亚洲激情中文字幕av网| 久久av一区二区三区.| 91精品国产91久久综合福利| 精品亚洲国产一区二区三区| 99久久免费看国产精品| 99精品欧美一区二区三区视频| 91欧美视频在线观看| 亚洲无人区码一码二码三码| 亚洲精品成人一区二区| 色婷婷国产精品高潮呻吟| 国产传媒剧情剧资源网站| 99精品国产麻豆一区二区三区| 日韩亚洲欧美不卡在线| 青青草成人免费在线公开视频|