A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

import java.util.Iterator;
import java.util.List ;
import java.util.ArrayList;

public class Demo01 {
        public static void main(String[] args) {
                List<String> allList = new ArrayList<String>() ;
                allList.add("cyc") ;
                allList.add("wff") ;
                allList.add("_") ;
                allList.add("abc") ;
               
                System.out.println("之前"+allList.size());
                Iterator<String> iter = allList.iterator();
                while(iter.hasNext()) {
                        String str = iter.next() ;
                        if("_".equals(str)) {
                                iter.remove() ;
                        } else {
                                System.out.println(str + "、");
                        }
                }
                System.out.println("之后"+allList.size());
        }
}


/**
使用iterator中的remove()方法删除一个元素后,allList的长度不应该变化,应该是iterator的对象长度变化
两者有什么联系??
*/

评分

参与人数 1技术分 +1 收起 理由
itpower + 1

查看全部评分

6 个回复

倒序浏览
iter 指向的还是allList中的元素,所以remove之后allList的长度也发生了变化
回复 使用道具 举报
Iterator<String> iter = allList.iterator(); 只是对象传递地址,并不是把allList中的值copy一份到iter对象中
回复 使用道具 举报
楼主可以自己看看源码,看看迭代器的remove方法是怎么写的,,                                    

12345.png (143.61 KB, 下载次数: 8)

12345.png
回复 使用道具 举报
  1. public Iterator<E> iterator() {
  2.         return new Itr();
  3.     }

  4.     /**
  5.      * An optimized version of AbstractList.Itr
  6.      */
  7.     private class Itr implements Iterator<E> {
  8.         int cursor;       // index of next element to return
  9.         int lastRet = -1; // index of last element returned; -1 if no such
  10.         int expectedModCount = modCount;

  11.         public boolean hasNext() {
  12.             return cursor != size;
  13.         }

  14.         @SuppressWarnings("unchecked")
  15.         public E next() {
  16.             checkForComodification();
  17.             int i = cursor;
  18.             if (i >= size)
  19.                 throw new NoSuchElementException();
  20.             Object[] elementData = ArrayList.this.elementData;
  21.             if (i >= elementData.length)
  22.                 throw new ConcurrentModificationException();
  23.             cursor = i + 1;
  24.             return (E) elementData[lastRet = i];
  25.         }

  26.         public void remove() {
  27.             if (lastRet < 0)
  28.                 throw new IllegalStateException();
  29.             checkForComodification();

  30.             try {
  31.                 ArrayList.this.remove(lastRet);
  32.                 cursor = lastRet;
  33.                 lastRet = -1;
  34.                 expectedModCount = modCount;
  35.             } catch (IndexOutOfBoundsException ex) {
  36.                 throw new ConcurrentModificationException();
  37.             }
  38.         }

  39.         final void checkForComodification() {
  40.             if (modCount != expectedModCount)
  41.                 throw new ConcurrentModificationException();
  42.         }
  43.     }
复制代码

这是arrylist的实现iterator接口的源码,我想你说的iterator的长度就应该是游标cursor应该回到了上一个lastRet
至于你说的alllist长度没有发生变化,应该发生变化了
回复 使用道具 举报
张稳 发表于 2014-4-13 18:15
这是arrylist的实现iterator接口的源码,我想你说的iterator的长度就应该是游标cursor应该回到了上一个las ...

为什么我们找见的源码会不一样?
  1.   @Override public Iterator<E> iterator() {
  2.         return new ArrayListIterator();
  3.     }

  4.     private class ArrayListIterator implements Iterator<E> {
  5.         /** Number of elements remaining in this iteration */
  6.         private int remaining = size;

  7.         /** Index of element that remove() would remove, or -1 if no such elt */
  8.         private int removalIndex = -1;

  9.         /** The expected modCount value */
  10.         private int expectedModCount = modCount;

  11.         public boolean hasNext() {
  12.             return remaining != 0;
  13.         }

  14.         @SuppressWarnings("unchecked") public E next() {
  15.             ArrayList<E> ourList = ArrayList.this;
  16.             int rem = remaining;
  17.             if (ourList.modCount != expectedModCount) {
  18.                 throw new ConcurrentModificationException();
  19.             }
  20.             if (rem == 0) {
  21.                 throw new NoSuchElementException();
  22.             }
  23.             remaining = rem - 1;
  24.             return (E) ourList.array[removalIndex = ourList.size - rem];
  25.         }

  26.         public void remove() {
  27.             Object[] a = array;
  28.             int removalIdx = removalIndex;
  29.             if (modCount != expectedModCount) {
  30.                 throw new ConcurrentModificationException();
  31.             }
  32.             if (removalIdx < 0) {
  33.                 throw new IllegalStateException();
  34.             }
  35.             System.arraycopy(a, removalIdx + 1, a, removalIdx, remaining);
  36.             a[--size] = null;  // Prevent memory leak
  37.             removalIndex = -1;
  38.             expectedModCount = ++modCount;
  39.         }
  40.     }
复制代码
回复 使用道具 举报
张稳 中级黑马 2014-4-13 18:30:59
7#
本帖最后由 张稳 于 2014-4-13 18:32 编辑
霍振鹏 发表于 2014-4-13 18:27
为什么我们找见的源码会不一样?

不知道额,版本的问题?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马