Сначала я отвечу на бонусный вопрос: Да, ArrayList
предварительно распределяет слоты. Он имеет конструктор, который принимает желаемое количество слотов в качестве аргумента, например, new ArrayList<Whatever>(1000)
. clear
не освобождает слоты.
Возврат общей ссылки на итератор имеет несколько проблем. Основная проблема в том, что у вас нет возможности узнать, когда итератор должен быть сброшен до первого элемента. Рассмотрим следующий код:
CustomArrayList<Whatever> list = ...
for (Whatever item : list) {
doSomething();
}
for (Whatever item : list) {
doSomethingElse();
}
Класс CustomArrayList
не может знать, что его общий итератор должен быть сброшен между двумя циклами. Если вы просто сбросите его на каждый вызов на iterator()
, то у вас возникнет проблема:
for (Whatever first : list) {
for (Whatever second : list) {
...
}
}
В этом случае вы не хотите сбросить итератор между вызовами.
@ Ответ Александра Прогребняка, вероятно, является лучшим способом перебора списка без использования Iterator
; просто убедитесь, что у вас есть быстрый произвольный доступ (т.е. никогда не используйте LinkedList
).
Я также хотел бы отметить, что вы попадаете в довольно сложную микрооптимизацию. Я бы посоветовал вам профилировать свой код и выяснить, является ли выделение итераторов реальной проблемой, прежде чем уделять ему много времени. Даже в играх вы должны оптимизировать только то, что нужно оптимизировать, иначе вы можете потратить много-много дней, экономя несколько миллисекунд на минутной операции.