2015-03-31 4 views
0

В Effective Java, говорится, чтоЧто такое использование метода removeRange из AbstractList класса в подклассах

метод removeRange не представляет интереса для конечных пользователей из списка реализации. Он предоставляется исключительно для того, чтобы упростить подклассы , чтобы обеспечить быстрый способ очистки подписок. В случае отсутствия метода removeRange подклассы должны были бы работать с квадратичной производительностью , когда метод clear был вызван в подсписках или переписал весь механизм сублиста с нуля - не простая задача!

Пожалуйста, взгляните на это link. Последний абзац. Он говорит в отсутствие метода removeRange, подклассы должны были бы делать с квадратичной производительностью.

Пожалуйста, объясните, почему автор сказал об этом.

+2

Ну, если бы не было метода 'removeRange', реализация классов должна была бы иметь дело с решением, которое было бы связано с O (N^2). –

+0

@EvanKnowles, я понимаю, что такое квадратичная производительность.Я спросил, почему это квадратично. – user961690

+1

Технически вы начали спрашивать об использовании такого метода в своем названии, а не о квадратичной производительности, поэтому это может ввести в заблуждение. – Gnoupi

ответ

1

AbstractList уже предоставляет стандартную реализацию subList(int from, int to). Метод clear() этого подменю по умолчанию просто вызывает removeRange(...) в его родительском списке.

Без removeRange(...) в этом списке должен использоваться итератор, вызывающий next() и remove() повторно. Но удаление элементов через Iterator.remove() может иметь линейную производительность. ArrayList должен перемещать все последующие элементы во внутреннем массиве каждый раз при удалении элемента. Вызов метода linear неоднократно приводит к квадратным производительности.

Примечание: Реализация removeRange(...) в AbstractList использует итератор по умолчанию. Поэтому подклассы должны переопределять его, чтобы обеспечить более эффективную реализацию (если доступно).

Преимущество: для оптимизации производительности подклассы должны реализовать только removeRange, и они могут поддерживать стандартную реализацию subList(...).

+0

Спасибо за ответ Sir ... – user961690

1

В отсутствии метода removeRange, подклассы должны сделать с квадратичной производительностью при ясный метод был вызван на подсписках

Автор делает предположение о том, что реализации должны были бы назвать remove для каждый элемент диапазона. В некоторых реализациях, таких как ArrayList s, remove необходимо скопировать все после удаления элемента, что имеет сложность O (n). Предполагая, что размер диапазона r, общая сложность реализации цикла будет O (n * r), которая является квадратичной.

Реализация removeRange, относящаяся к ArrayList, имеет сложность O (n), поскольку вы можете скопировать ее в новое положение в одном цикле.

+0

Спасибо за ответ Sir ... – user961690

+0

Прошу прощения, сэр, я не мог принять ваш ответ. Но, пожалуйста, поверьте мне, что ваш ответ такой же яркий, как и тот ответ, который я принял. Я рассмотрю вопросы, на которые вы ответили, и сразу же присудите вам +25 или более. Спасибо – user961690

 Смежные вопросы

  • Нет связанных вопросов^_^