java ArrayList 内部类Itr的判断 不解,求答

-悟空- 发布于 2014/07/11 08:06
阅读 364
收藏 0

大家好 以下是代码ArrayList 私有的内部类Itr:

//类似于vector
	private class Itr implements Iterator<E> {
        int cursor;       // index of next element to return
        int lastRet = -1; // index of last element returned; -1 if no such
		//用于检查线程是否同步,如果线程不同步,它们两个的值不一样
        int expectedModCount = modCount;

        public boolean hasNext() {
            return cursor != size;
        }

        @SuppressWarnings("unchecked")
        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];
        }

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

		//线程安全检查
        final void checkForComodification() {
            if (modCount != expectedModCount)
                throw new ConcurrentModificationException();
        }
    }



大家好,我的疑问是在判断的时候为什么要先跟size判断,再去判断elementData.length,size不是实际大小嘛,而length不是这个ArrayList目前的容量吗,应该是length一直不会小于size吧,岂不是第二个判断永远不会进入?不知道我的理解是哪里出了问题,希望有了解的能帮我解答下,谢谢~~~

加载中
0
len
len
猜的,应该跟ArrayList不是线程安全的有关吧。
0
len
len
多对多的删除应该是指某一方实体删除,同时删除相应的关系。而你想要的只是删除部分关系吧。
0
星爷
星爷

length 是数组的长度  size是存储元素的个数。

size<=length

-悟空-
-悟空-
对啊 如果都不大于size了 为什么还要判断length啊
0
星爷
星爷

引用来自“len”的评论

猜的,应该跟ArrayList不是线程安全的有关吧。
对的,跟线程安全有关系,并发的时候可能第一个判断是对的,所以可以执行到第二个判断。
-悟空-
-悟空-
还是没理解,跟并发有关系嘛?就算并发也只是size改变,length只会增大啊,length不就是数组长度吗
0
len
len
length当然会变,当插入到临界的时候就会申请一个新的内存空间。
-悟空-
-悟空-
对啊 但是length只会变大,并且无法小于size 我理解的有问题嘛
0
len
len
那你看看remove的源码。length应该也会变小的。
J
JVM
length在remove()并不会变小
返回顶部
顶部