«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > [Сравнение кода] Collections.singletonList и List.of

[Сравнение кода] Collections.singletonList и List.of

Опубликовано 7 августа 2024 г.
Просматривать:558

[Code Compare] Collections.singletonList vs List.of

В этой серии статей я сравниваю разные способы написания кода одной и той же функциональности. В последнем сообщении сравнивались Collections.singletonList и ArrayList для создания списка из одного элемента.

В этом посте я сравню Collections.singletonList с другим известным фабричным методом List.of.

Коллекции::singletonList

Сигнатура метода

public static List singletonList(T o)

  public static void main(String[] args) {
    final var addresses = Collections.singletonList(
        new Address(
            "742 Evergreen Terrace",
            "Springfield",
            "New York",
            "13468",
            "US"
        ));

    System.out.println(addresses);
  }

Описание

Этот метод возвращает неизменяемый список, содержащий только указанный объект. Он был представлен в Java 1.3. Преимущества по сравнению с ArrayList были описаны в предыдущем посте, но резюмируем:

  1. Встроенная реализация: Инициализируйте нужный элемент в одной строке.
  2. Неизменяемость: Размер списка и содержимое его отдельного элемента изменить нельзя.
  3. Распределение памяти: Класс SingletonList содержит только одно поле для одного элемента.
  4. Использование ЦП: Конструктор SingletonList принимает один элемент в качестве параметра, не требуя изменения размера или манипуляций с массивом.

Список

Сигнатура метода

статический Список of()

  public static void main(String[] args) {
     final var addresses2 = List.of(
        new Address(
            "1007 Mountain Drive",
            "Bristol Township",
            "New Jersey",
            null,
            "US"
        ));

    System.out.println(addresses2);
  }

Описание

Метод List.of(E e) также является фабричным методом, который возвращает неизменяемый список. В отличие от Collections.singletonList(E e), который поддерживает только один элемент, List.of поддерживает от 0 до 10 элементов, а также массивы с несколькими элементами. Он был представлен в Java 9, через 17 лет после SingletonList.

Интересно отметить, что в отличие от SingletonList, у которого есть комментарий:

Возвращает неизменяемый список, содержащий только указанный объект.

В Array.of указано, что это Неизменяемый список:

Возвращает неизменяемый список, содержащий один элемент.

Это отражает новое понимание неизменности коллекций. Согласно этой документации:

Коллекция считается неизменяемой, если элементы нельзя добавлять, удалять или заменять. Однако неизменяемая коллекция является неизменяемой только в том случае, если элементы, содержащиеся в коллекции, являются неизменяемыми.

Несмотря на различия в терминологии, оба фабричных метода имеют практически одинаковую функциональность. Заглянув глубже в UnmodifyingList, мы можем найти:

  static  List of(E e1) {
      return new ImmutableCollections.List12(e1);
  }

Какой сюрприз, они использовали не очень точный термин Неизменяемый, однако!

  static final class List12 extends     
    AbstractImmutableList implements Serializable {

        @Stable
        private final E e0;

        @Stable
        private final E e1;

        List12(E e0) {
            this.e0 = Objects.requireNonNull(e0);
            this.e1 = null;
        }
        ...
    }
static abstract class AbstractImmutableList extends
  AbstractImmutableCollection implements List, RandomAccess {

      // all mutating methods throw UnsupportedOperationException
      @Override public void    add(int index, E element) { throw uoe(); }
      @Override public boolean addAll(int index, Collection extends E> c) { throw uoe(); }
      @Override public E       remove(int index) { throw uoe(); }
      @Override public void    replaceAll(UnaryOperator operator) { throw uoe(); }
      @Override public E       set(int index, E element) { throw uoe(); }
      @Override public void    sort(Comparator super E> c) { throw uoe(); }

Единственное отличие состоит в том, что List12 имеет два поля для потенциально двух элементов, что также приводит к незначительному использованию памяти, если только речь не идет о больших объектах.

Заключение

На этот раз мы сравнили фабричные методы Collections.singletonList и List.of, чтобы создать список из одного элемента. Мы обсудили семантику неизменяемого и неизменяемого и показали, что оба метода эффективны, лаконичны и не требуют больших ресурсов. Если вы можете использовать более позднюю версию Java, она предпочтительнее из-за ее привычности, ясности и потому, что мы используем интерфейс списка гораздо чаще, чем интерфейс коллекций. Если использовать более старую версию Java, Collections.singletonList остается надежным выбором.

Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/leandrostl/code-compare-collectionssingletonlist-vs-listof-385?1. Если есть какие-либо нарушения, свяжитесь с [email protected], чтобы удалить ее.
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3