То, что вы можете сэкономить на сложности, вы можете потерять в распределении памяти, поэтому не обязательно более эффективно.Arrraylist использует нечто похожее на алгоритм разбиения на месте для запуска резервного массива и проверки сравнения.
При сравнении он просто смотрит, чтобы найти индекс первого вхождения совпадения с резервным массивом Object[]
.Алгоритм поддерживает два индекса, один для итерации по массиву поддержки и один в качестве заполнителя для совпадений.В случае совпадения он просто перемещает индекс на массиве поддержки и переходит к следующему входящему элементу;это относительно дешево.
Если доходит до того, что обнаруживается, что входящая коллекция не содержит значения по текущему индексу в массиве резервных копий, она просто перезаписывает элемент, где произошло последнее совпадение, с элементом по текущему индексубез использования нового выделения памяти.Этот шаблон повторяется до тех пор, пока все элементы в ArrayList не будут сопоставлены с входящей коллекцией, следовательно, сложность, о которой вы беспокоитесь.
Например: рассмотрим массив A с 1,2,4,5 и коллекцию 'C 'с 4,1, с которыми мы сопоставляем;желая удалить 4 и 1. вот каждая итерация цикла for, которая будет идти 0 -> 4
итерация: r - индекс цикла for для массива a for (; r < size; r++)
r =0 (содержит ли C 1? Да, переходите к следующему) A: 1,2,4,5 w = 0
r = 1 (C содержит 2? Нет, скопируйте значение в r вточка, на которую указывает w ++) A: 2,2,4,5 w = 1
r = 2 (Содержит ли C 4? Да, пропустить) A: 2,2,4,5 w = 1
r = 3 (Содержит ли C 5? Нет, скопируйте значение в точке r в точку, указанную w ++)
A: 2,5,4,5 w = 2
r = 4, остановка
Сравните значение w с размером резервного массива, равным 4. Поскольку они не равны Обнулите значения от w до конца массива и сбросьте размер.
A: 2,5 размера 2
Встроенный метод removeAll также считает, что ArrayLists может содержать значение null.Вы можете добавить NPE для record.getStudentId () в вашем решении выше.Наконец, removeAll защищает от исключений при сравнении на Collection.contains.если это произойдет, он, наконец, использует нативную memcopy, которая очень эффективно защищает резервный массив от повреждения.