Я предполагаю, что mapOverlays
содержит ссылку ArrayList
.
Если mapOverlays
объявлен как List
или ArrayList
, то mapOverlays.remove(n)
будет ссылаться на remove(int)
метод, который удаляет объект с заданным смещением.(Пока все хорошо ...)
Когда вы удаляете элемент nth
массива, используя remove(int)
, элементы, начинающиеся с позиции n + 1
и, прежде всего, сдвигаются вниз на единицу.Так что то, что вы делаете, в большинстве случаев не сработает.(Фактически, вы, вероятно, удалите примерно половину элементов, которые хотите удалить, а затем получите IndexOutOfBoundsException
.)
Лучшее решение: либо
for (int i = size - 1; i > 0; i--) {
mapOverlays.remove(i);
}
, либо
tmp = mapOverlays.remove(0);
mapOverlays.clear();
mapOverlays.add(tmp);
(Обратите внимание, что первое решение всегда удаляется из конца списка, избегая необходимости копировать элементы, чтобы заполнить отверстие, оставленное удаленным элементом. Отличная производительность важна для большого ArrayList.)
Однако, если mapOverlays
объявлен как Collection
, remove(n)
свяжется с перегрузкой remove(<E>)
, которая удаляет объект, соответствующий его аргументу.В зависимости от объявленного типа, это либо выдаст ошибку компиляции, либо int
будет автоматически упакован как Integer
, и вы (вероятно) ничего не удалите. GOTCHA!