Hello,

javadoc for AbstractList.modCount is described as 

> 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.

However when we execute this

------------------------
ArrayList<Object> objects = new ArrayList<>();
boolean result = objects.addAll(Collections.emptyList());
------------------------

modCount is 1, not 0 while result is false. I.e. returned value claims the list 
is not modified, but the inner state of the same list demonstrates the opposite.

The reason is implementation of List::addAll method:

public boolean addAll(Collection<? extends E> c) {
    Object[] a = c.toArray();
    modCount++;                                                                 
        // <------
    int numNew = a.length;
    if (numNew == 0)
        return false;                                                           
             // <------
    Object[] elementData;
    final int s;
    if (numNew > (elementData = this.elementData).length - (s = size))
        elementData = grow(s + numNew);
    System.arraycopy(a, 0, elementData, s, numNew);
    size = s + numNew;
    return true;
}

I think modCount++;  should be placed after value of numNew is checked. Then 
it's incremented only when underlying array is actually changed.

Regards,

Sergei Tsypanov

Reply via email to