Ваши самые большие, по большей части ненужные накладные расходы, это необходимость упаковывать примитивы вместо использования int[]
.
ArrayList
, как правило, работает быстрее практически в любой реальной ситуации (используйте ArrayDeque
для очередей). В этом случае доступ к ссылкам на элементы гарантированно будет последовательным через память, что благоприятно для кэша, а также не потребует дополнительных затрат на узлы и чтения следующей ссылки на узел.
Лучший алгоритм для всех, кроме самые маленькие коллекции, это будет двоичный поиск в отсортированном массиве. Даже HashSet
(или TreeSet
) будет лучше.