首頁 >Java >java教程 >詳解Java AbstractCollection中的remove方法

詳解Java AbstractCollection中的remove方法

Y2J
Y2J原創
2017-05-09 13:50:132150瀏覽

這篇文章主要介紹了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的實作類別。

寫一段測試程式碼:

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已經指向了目前元素的下一個元素,而使用lasrRet來取得目前的索引上的數據並將其傳回。

而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遞增變為2,lastRet被賦值為1
3. 執行刪除,刪除該集合lastRet上所代表的元素。刪除完成後修改cursor指標同時使得expectedModCount和modCount保持一致避免fastfail。

【相關推薦】

1. Java免費影片教學

#2. 極客學院Java影片教學

#3. JAVA教學手冊

以上是詳解Java AbstractCollection中的remove方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn