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