Ответ 1
Гуава здесь.
Collections2.filter(elements, predicate).size()
является предпочтительным, так как он не копирует - оба метода filter
возвращают представление, но
Iterables.size(Iterables.filter(elements, predicate))
по существу эквивалентен, и аналогичным образом найдет ответ без какого-либо копирования.
Что касается относительной скорости построения ArrayList
по сравнению с ImmutableList
, то он зависит от используемого метода построения:
-
ImmutableList.copyOf(collection)
должно занимать почти ровно столько же времени. (Он должен проверить нули, но это дешево.) -
ImmutableList.builder()....build()
принимает небольшой постоянный множитель дольше, потому что он должен использоватьArrayList
внутриBuilder
, так как мы заранее не знаем, сколько элементов будет добавлено. -
ImmutableList.of(...)
будет иметь одинаковую скорость.
Тем не менее, концептуальные преимущества использования ImmutableList
часто перевешивают небольшие затраты на производительность, особенно если вы часто будете распространять списки.