ArrayDeque реализован в виде массива, почему это не произвольный доступ?
Я знаю, что ArrayDeque быстр при добавлении и удалении простых списков. Я на самом деле проверил это, было быстрее добавлять и удалять, чем LinkedList. Потому что я знаю, что он реализован в виде массива, так почему бы не произвольный доступ?
Я прочитал файл ArrayDeque.java в Java src. Но я плохо понимаю свои знания английского. Я видел много статей от Google и Stack Overflow, но я не получил ответы, которые хотел.
В заключение я хочу получить ответ:
1. Почему ArrayDeque не произвольный доступ? (Мне очень любопытно) 2. В каких ситуациях используется ArrayDeque? 3. ArrayDeque не реализован как массив?(Знаю ли я неверные знания?)
Большое спасибо за Ваш ответ!
4 ответа
Как упомянуто здесь, ArrayDeque - реализация массива изменяемого размера интерфейса Deque. Подчеркивает структуру данных Array. Тем не менее, он не поддерживает произвольный доступ, поскольку предоставляет интерфейс двусторонней очереди. Если вы хотите получить доступ к случайному элементу Deque, вы можете вызвать toArray()
а затем получить доступ к элементам по индексу.
Ответ в том, что нет веской причины. Было бы легко добавить постоянное время get(int)
а также set(int,E)
в ArrayDeque
, Мне не раз приходилось реализовывать алгоритмы ArrayDeque
в пределах ArrayList
чтобы восполнить этот недостаток.
- Потому что вы не можете получить доступ к элементу в i-й позиции в постоянное время, в худшем случае.
- Всякий раз, когда вам нужно добавить и взять элементы с обоих концов.
- Да, это поддерживается массивом.
Я думаю, что краткий ответ на вопрос «почему нет произвольного доступа» заключается в том, что это не казалось необходимым при создании класса, а также не имело смысла: во-первых, это своего рода , что в основном позволяет доступ на обоих концах, и это все. Так что я как бы согласен, что функция произвольного доступа не должна быть в
Теперь, если вы хотите решить недостаток
- Прежде всего, вам действительно нужен произвольный доступ? Возможно
или достаточно хороши. - Для действительно произвольного доступа это, вероятно, не очень быстро, но должно быть O(1):
deque.stream().skip(index).findFirst().get()