конвертировать Set с помощью List.of или ArrayList? - PullRequest
1 голос
/ 29 апреля 2020

Я хочу преобразовать набор в список. Какой метод мне лучше выбрать (мне все равно, неизменен он или нет):

версия 1:

return List.of(myHashSet().toArray());

или версия 2:

return new ArrayList<Strategy>(myHashSet());

Есть ли другие отличия, кроме того, что версия 1 неизменна? Например, List.of более компактно по сравнению с ArrayList.

1 Ответ

2 голосов
/ 29 апреля 2020

Единственные различия, которые я вижу между вашими 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, используйте этот конкретный класс.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...