Подтвердите цикл Java LinkedList " foreach
Добрый День,
может кто-нибудь подтвердить, что было сказано в нижней части этого сообщения java-итерация связанного списка В сообщении упоминается, что вы можете использовать for (char c: linkedlistofchars) синтаксис, и он все равно будет O (n). Я думаю, что доступ к списку, который выглядит так...
a b c d e f
фактически запускается в начале связанного списка во время каждой итерации цикла for, например...
a ab abc abcde abcdef
вызывает время доступа не должно быть O (n).
как именно это работает? Это имеет смысл с массивом и операторами массива, но как синтаксис java знает, как перебирать связанный список с помощью foreach цикл в java?
Я думал, что структура данных LinkedList была просто дополнительной библиотекой, а не частью синтаксиса основного языка. (Я понимаю, что класс LinkedList является стандартным в java)
надеюсь, я ясно объяснил свою озабоченность достаточно.... Спасибо
2 ответов
прежде всего, любой экземпляр класса, который реализует Iterable
может использоваться в цикле foreach. Причина в том, что после компиляции, for (Suit suit : suits)
на самом деле становится for (Iterator i = suits.iterator(); i.hasNext(); )
. См.данное объяснение подробнее.
и коллекции реализуют оптимизированные итераторы, специфичные для структуры данных. Особенно к LinkedList
, итератор сохраняет указатель на последний возвращаемый объект, чтобы разрешить постоянное время next()
и previous()
операции. Поэтому, перебираете linkedlist используя foreach-loop будет yeild o (n) сложность времени. Вы можете посмотреть исходный код для более подробной информации.
пример кода по этой ссылке демонстрирует разницу. OP по этой ссылке неверен: вызов list.get(i)
начнется в начале списка каждый раз, а затем сосчитать до i
достигнуто, в то время как iterator.next()
сохранит ваше место в списке, поэтому каждый раз, когда он вызывается, ему нужно только прочитать следующее значение, а не все значения между 0 и n.