亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java集合刪除元素ArrayList實(shí)例詳解

 更新時間:2017年04月26日 10:20:02   投稿:lqh  
這篇文章主要介紹了Java集合刪除元素ArrayList實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下

Java集合刪除元素ArrayList實(shí)例詳解

AbstractCollection集合類中有一個remove方法,該方法為了適配多種不同的集合,允許刪除空的元素,看這部分代碼的時候產(chǎn)生了疑問,為什么這里直接用it.remove()就直接刪除了?

public boolean remove(Object o) {
    Iterator<E> it = iterator();
    if (o==null) {
      while (it.hasNext()) {
        if (it.next()==null) {
          it.remove();
          return true;
        }
      }
    } else {
      while (it.hasNext()) {
        if (o.equals(it.next())) {
          it.remove();
          return true;
        }
      }
    }
    return false;
  }

接下來,拿ArrayList為例子,進(jìn)行說明。其繼承結(jié)構(gòu)如下圖所示。并且,ArrayList內(nèi)部有其使用的Iterator的實(shí)現(xiàn)類。

編寫一段測試代碼:

AbstractCollection<String> list = new ArrayList<>();
    list.add("a");
    list.add(null);
    list.add(null);

    Iterator<String> iter = list.iterator();
    while(iter.hasNext()) {
      if(iter.next() == null) {
        iter.remove();
      }
    }
    System.out.println(list);

關(guān)鍵點(diǎn)還是在于iter.next() == null 這一行,next的源碼如下:

 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];
    }

cusor在這里表示的是遍歷時的索引,在調(diào)用next方法的時候其實(shí)cusor已經(jīng)指向了當(dāng)前元素的下一個元素,而使用lasrRet來獲取當(dāng)前的索引上的數(shù)據(jù)并將其返回。

而remove()方法中是通過lastRet的索引進(jìn)行刪除的。

  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();
      }
    }

借助上文中提到的測試實(shí)例,可以進(jìn)行每一步的推算。

1. 調(diào)用next()方法,cursor指向0號元素,i被賦值為cursor的值,然后cursor被修改為i+1,指向了1號元素,也就是null所在的位置, lastRet被賦值為0。
2. 調(diào)用next()方法,cursor指向了1號元素,賦值給i,然后cursor又通過i+1遞增變?yōu)?,lastRet被賦值為1
3. 執(zhí)行刪除,刪除該集合lastRet上所代表的元素。刪除完成后修改cursor指針同時使得expectedModCount和modCount保持一致避免fastfail。

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

相關(guān)文章

  • Spring中@ExceptionHandler注解的工作原理詳解

    Spring中@ExceptionHandler注解的工作原理詳解

    這篇文章主要介紹了Spring中@ExceptionHandler注解的工作原理詳解,Spring Web注解@ExceptionHandler可以用來指定處理某類異常的控制器方法,從而在這些異常發(fā)生時,會有相應(yīng)的控制器方法來處理此類異常,需要的朋友可以參考下
    2024-01-01
  • java實(shí)現(xiàn)隨機(jī)輸出300題四則運(yùn)算

    java實(shí)現(xiàn)隨機(jī)輸出300題四則運(yùn)算

    本文主要介紹了java實(shí)現(xiàn)隨機(jī)輸出300題四則運(yùn)算實(shí)例,具有很好的參考價值。下面跟著小編一起來看下吧
    2017-03-03
  • Mybatis批量插入更新xml方式和注解方式的方法實(shí)例

    Mybatis批量插入更新xml方式和注解方式的方法實(shí)例

    這篇文章主要給大家介紹了關(guān)于Mybatis批量插入更新xml方式和注解方式的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Mybatis具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • java中的PriorityQueue類過程詳解

    java中的PriorityQueue類過程詳解

    這篇文章主要介紹了java中的PriorityQueue類,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • springboot post接口接受json時,轉(zhuǎn)換為對象時,屬性都為null的解決

    springboot post接口接受json時,轉(zhuǎn)換為對象時,屬性都為null的解決

    這篇文章主要介紹了springboot post接口接受json時,轉(zhuǎn)換為對象時,屬性都為null的解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • 一篇文章帶你了解JVM垃圾回收

    一篇文章帶你了解JVM垃圾回收

    這篇文章主要介紹了JVM的種垃圾回收,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-08-08
  • 最新評論