Метод removeAll () занимает много времени - PullRequest
0 голосов
/ 16 марта 2020
List<Batch> vAllBatchList = getAllBatchCollection().toList(); //Has 700k records
List<Batch> vKeepableBatchCollection = getKeepableBatchCollection(pDaysKeepHistory).toList(); //has 600k records
vAllBatchList.removeAll(vKeepableBatchCollection);

В приведенной выше 3-й строке метод removeAll занимает слишком много времени, чтобы завершить sh. Как оптимизировать метод removeAll здесь?

1 Ответ

3 голосов
/ 16 марта 2020

Если вы преобразуете List элемента для удаления в Set, он должен быть быстрее:

vAllBatchList.removeAll(new HashSet<>(vKeepableBatchCollection));

Это предполагает, что Batch переопределяет класс hashCode и equals правильно .

Объяснение: removeAll для ArrayList (я предполагаю, что ваш vAllBatchList List является ArrayList) итерирует по всем элементам List, для которых он вызывается, и проверяет, содержит ли переданный Collection их. Если переданный Collection является Set, contains займет ожидаемое постоянное время (O(1)), а если Collection - List, это займет линейное время (O(n)).

Конечно, если вы можете напрямую сгенерировать Set элементов vKeepableBatchCollection вместо того, чтобы сначала создать List, а затем преобразовать его в Set, это было бы еще лучше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...