91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2020-09-08 10:18:25 來源:腳本之家 閱讀:359 作者:lqh 欄目:編程語言

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的實現類。

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

編寫一段測試代碼:

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。

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

马山县| 龙江县| 宁蒗| 河间市| 景泰县| 静宁县| 黄冈市| 龙江县| 长顺县| 黔东| 南汇区| 华阴市| 裕民县| 宜黄县| 丽江市| 托克逊县| 南和县| 法库县| 兴和县| 阿荣旗| 屯留县| 伊宁县| 广河县| 峨眉山市| 柳州市| 芜湖市| 新乐市| 华池县| 商城县| 顺昌县| 吴江市| 沁水县| 梁山县| 连山| 惠东县| 迁安市| 永仁县| 苏尼特右旗| 城固县| 土默特左旗| 镇平县|