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

Java集合刪除元素ArrayList實例詳解

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

Java集合刪除元素ArrayList實例詳解

AbstractCollection集合類中有一個remove方法,該方法為了適配多種不同的集合,允許刪除空的元素,看這部分代碼的時候產生了疑問,為什么這里直接用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為例子,進行說明。其繼承結構如下圖所示。并且,ArrayList內部有其使用的Iterator的實現(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);

關鍵點還是在于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在這里表示的是遍歷時的索引,在調用next方法的時候其實cusor已經(jīng)指向了當前元素的下一個元素,而使用lasrRet來獲取當前的索引上的數(shù)據(jù)并將其返回。

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

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

借助上文中提到的測試實例,可以進行每一步的推算。

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

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

相關文章

  • java Scanner類的使用示例代碼

    java Scanner類的使用示例代碼

    這篇文章主要介紹了java Scanner類的使用,Scanner類還可以任意地對字符串和基本類型(如int和double)的數(shù)據(jù)進行分析。借助于Scanner,可以針對任何要處理的文本內容編寫自定義的語法分析器,感興趣的朋友跟隨小編一起看看吧
    2021-07-07
  • Spring security登錄過程邏輯詳解

    Spring security登錄過程邏輯詳解

    這篇文章主要介紹了SSpringsecurity登錄過程邏輯詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-04-04
  • 基于IDEA查看maven依賴結構流程解析

    基于IDEA查看maven依賴結構流程解析

    這篇文章主要介紹了基于IDEA查看maven依賴結構流程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-09-09
  • 通過Java視角簡單談談局部性原理

    通過Java視角簡單談談局部性原理

    程序的局部性原理是指程序在執(zhí)行時呈現(xiàn)出局部性規(guī)律,即在一段時間內,整個程序的執(zhí)行僅限于程序中的某一部分,這篇文章主要給大家介紹了關于通過Java視角簡單談談局部性原理的相關資料,需要的朋友可以參考下
    2021-07-07
  • Spring中@ExceptionHandler注解的工作原理詳解

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

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

    java實現(xiàn)隨機輸出300題四則運算

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

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

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

    java中的PriorityQueue類過程詳解

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

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

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

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

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

最新評論