java modcount(arraylist)

ua4mk5z4  于 2021-07-05  发布在  Java
关注(0)|答案(6)|浏览(285)

在eclipse中,我看到了 ArrayList 对象具有 modCount 现场。它的目的是什么(修改次数?)

1zmg4dgp

1zmg4dgp1#

它是集合的结构(大小)更改的次数

jutyujz0

jutyujz02#

它允许列表的内部成员知道是否有可能导致当前操作产生错误结果的结构修改。
如果你曾经 ConcurrentModificationException 由于在迭代时修改列表(比如删除一个项),它的内部 modCount 是迭代器提示的。
abstractlist文档给出了很好的详细描述。

5vf7fwbs

5vf7fwbs3#

从java api的mod count字段:
此列表在结构上被修改的次数。结构修改是指那些改变列表大小的修改,或者以某种方式扰乱列表,使得正在进行的迭代可能产生不正确的结果。

6jjcrrmo

6jjcrrmo4#

protected transient int modCount = 0; 财产是否在 public abstract class AbstractList ,
确定此集合中进行的结构修改的总数。
意味着如果有一个add/remove,那么这两个操作的计数器都会有一个增量。因此,对于任何修改,此计数器总是递增的。所以对尺寸计算没有用处。
这将是有用的抛出 ConcurrentModificationException . ConcurrentModificationException 将在一个线程迭代集合时抛出,并且另一个线程对集合进行了修改。这就像每当创建迭代器对象时,modcount都会设置为expectedcount,并且每个迭代器导航expectedcount都会与modcount进行比较以抛出 ConcurrentModificationException 当有变化的时候。

private class Itr implements Iterator<E> {
    ...
    ...
    /**
     * The modCount value that the iterator believes that the backing
     * List should have.  If this expectation is violated, the iterator
     * has detected concurrent modification.
     */
    int expectedModCount = modCount;

    public E next() {
        checkForComodification();
    ...
    ...
    }

    final void checkForComodification() {
        if (modCount != expectedModCount)
            throw new ConcurrentModificationException();
    }
    ...
    ...

}
``` `size()` api不适合这里;因为如果在调用next()之前发生了两个操作(add和remove),那么still size将显示相同的值;因此无法使用检测在此集合上发生的修改 `size()` 迭代时的api。因此我们需要修改ismodcount的递增计数器。
w3nuxt5m

w3nuxt5m5#

从abstractlist上的1.4 javadoc:
受保护的 transient int modcount
此列表在结构上被修改的次数。结构修改是指那些改变列表大小的修改,或者以某种方式扰乱列表,使得正在进行的迭代可能产生不正确的结果。
此字段由迭代器和listiterator方法返回的迭代器和列表迭代器实现使用。如果此字段的值意外更改,迭代器(或列表迭代器)将抛出concurrentmodificationexception以响应next、remove、previous、set或add操作。这提供了快速失败的行为,而不是在迭代过程中面对并发修改时的不确定性行为。
子类使用此字段是可选的。

lf5gs5x2

lf5gs5x26#

对。如果你打算延长 AbstractList ,您必须编写代码,使其符合modcount的javadoc,如下所述:

/**
 * The number of times this list has been <i>structurally modified</i>.
 * Structural modifications are those that change the size of the
 * list, or otherwise perturb it in such a fashion that iterations in
 * progress may yield incorrect results.
 *
 * <p>This field is used by the iterator and list iterator implementation
 * returned by the {@code iterator} and {@code listIterator} methods.
 * If the value of this field changes unexpectedly, the iterator (or list
 * iterator) will throw a {@code ConcurrentModificationException} in
 * response to the {@code next}, {@code remove}, {@code previous},
 * {@code set} or {@code add} operations.  This provides
 * <i>fail-fast</i> behavior, rather than non-deterministic behavior in
 * the face of concurrent modification during iteration.
 *
 * <p><b>Use of this field by subclasses is optional.</b> If a subclass
 * wishes to provide fail-fast iterators (and list iterators), then it
 * merely has to increment this field in its {@code add(int, E)} and
 * {@code remove(int)} methods (and any other methods that it overrides
 * that result in structural modifications to the list).  A single call to
 * {@code add(int, E)} or {@code remove(int)} must add no more than
 * one to this field, or the iterators (and list iterators) will throw
 * bogus {@code ConcurrentModificationExceptions}.  If an implementation
 * does not wish to provide fail-fast iterators, this field may be
 * ignored.
 */

查看实际的jdk源代码并阅读javadocs(在线或在代码中)有助于理解正在发生的事情。祝你好运。
我要补充的是,您可以将jdk源代码添加到eclipse中,以便在任何javase类/方法上单击f3或ctrl+都指向实际的源代码。如果您下载了jdk,那么在jdk安装文件夹中应该有src.zip。现在,在eclipse的顶部菜单中,转到window» 偏好» java» 已安装JRE。选择当前jre并单击编辑。选择rt.jar文件,单击源附件,单击外部文件,导航到jdk文件夹,选择src.zip文件并添加它。现在JavaSEAPI的源代码在eclipse中可用。jdk源代码提供了很多见解。快乐编码:)

相关问题