Единственные различия, которые я вижу между вашими 1 и 2:
List.of
создает мелко неизменный список. Вы не можете добавлять или удалять элементы из списка. Конечно, состояние в каждом объекте, содержащемся в списке, все равно будет изменчивым, если это уже так. Ваш # 1 приводит к неизменяемому списку, в то время как ArrayList
из # 2 является изменяемым. - С # 2 вы знаете и управляете конкретным классом результирующего
List
. С # 1 вы не знаете и не управляете конкретным классом, который используется за кулисами при вызове List.of
. Функция List.of
может свободно использовать любой класс, который реализует интерфейс List
, возможно, даже класс, который не является общедоступным с Java Collections Framework. Функция List.of
может быть даже умна при выборе оптимизированного класса, соответствующего вашим конкретным собранным объектам.
Вы сказали:
List.of более экономичен по сравнению с ArrayList.
Вы не можете подать такое заявление, если вы означает использование памяти (RAM). Как обсуждалось выше, вы не знаете и не контролируете выбор класса, используемого для реализации интерфейса List
при вызове List.of
. Используемый класс может различаться в зависимости от ваших данных и может варьироваться в зависимости от версии Java, используемой во время выполнения.
Что касается памяти, используемой при вызове toArray
, массив объектов на самом деле является просто массивом ссылок (указателей). Создание этого массива занимает мало памяти и быстро. Ссылки на объекты, вероятно, будут иметь значение в четыре или восемь октетов (в зависимости от того, является ли ваша JVM 32-битной или 64-битной), хотя не указывается Java. При создании массива это , а не , как если бы содержимое ваших элементов дублировалось. Таким образом, для большинства распространенных приложений краткое создание и удаление этого массива будет незначительным.
И, как прокомментировал Кун , Java 10 увидел появление нового фабричного метода List.copyOf
, который принимает Collection
. Поэтому не нужно звонить toArray
.
List<Strategy> myStrategyList = List.copyOf( myStrategySet ) ;
Вывод:
- Если вам нужен неизменный список, используйте
List.copyOf
. - Если вам нужна изменчивость или любая другая функция, определяющая c для конкретной реализации
List
, используйте этот конкретный класс.