Я хотел бы знать, есть ли более эффективные способы превратить коллекции в структуры, которые я могу повторять с помощью индексов
Единственный эффективный способ - проверить с помощью instanceof
, если ваша коллекция действительно List
. Если это так, то вы можете преобразовать его и просто использовать, например, sublist(start, stop)
для получения результата с разбивкой на страницы.
Обратите внимание, что доступ к элементу по его индексу также может быть неэффективным. В LinkedList
доступ к элементу является операцией O (N), поэтому доступ к M элементам по индексу производит операцию O (M * N), тогда как использование sublist()
является операцией O (M + N).
Существует специализация интерфейса List
, которая используется для отметки списков, к которым быстро осуществляется доступ по индексу, а именно: RandomAccess
, вы можете или не захотите проверить это, чтобы решить лучшая стратегия.
Кроме того, есть ли разница во времени выполнения между
List x = new ArrayList <> (exampleCollection);
и
List<exampleClass> x = (List<exampleClass>)exampleCollection;
Абсолютно точно.
Второй - отливка и практически не требует затрат. Просто помните, что x
и exampleCollection
- это один и тот же объект (изменение одного аналогично изменению другого). Очевидно, что приведение может завершиться неудачно с ClassCastException, если exampleCollection
на самом деле не является списком.
Первый выполняет копирование, которое требует затрат как в ЦП (обход exampleCollection
), так и в памяти (выделение массив размеров коллекции). И то, и другое довольно мало для небольших коллекций, но ваш пробег может отличаться.