Подтвердите цикл 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.