Я обнаружил ситуацию, когда minCapacity < 0
.Предположим, есть два длинных массива ArrayList, когда вы добавляете один к другому, size + numNew
будет переполнен.
public boolean addAll(Collection<? extends E> c) {
Object[] a = c.toArray();
int numNew = a.length;
ensureCapacityInternal(size + numNew); // Increments modCount
System.arraycopy(a, 0, elementData, size, numNew);
size += numNew;
return numNew != 0;
}
Например, приведенный ниже код вызовет ошибку OutOfMemoryError.
int oneSize = Integer.MAX_VALUE - 16;
int twoSize = oneSize >> 1;
List<Byte> one = new ArrayList<>(oneSize);
for (int i = 0; i < oneSize; i++) {
one.add((byte) 1);
}
List<Byte> two = new ArrayList<>(twoSize);
for (int i = 0; i < twoSize; i++) {
two.add((byte) 2);
}
one.addAll(two);