”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > [代码比较] Collections.singletonList 与 List.of

[代码比较] Collections.singletonList 与 List.of

发布于2024-08-07
浏览:235

[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. CPU 使用率: SingletonList 构造函数接受单个元素作为参数,不需要调整大小或数组操作。

列表

方法签名

static List 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 个元素,以及具有多个元素的数组。它是在 singletonList 17 年后在 Java 9 中引入的。

有趣的是,与 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 版本,那么它是最好的,因为它熟悉、清晰,而且因为我们使用 List 接口比 Collections 多得多。如果仅限于较旧的 Java 版本,Collections.singletonList 仍然是一个不错的选择。

版本声明 本文转载于:https://dev.to/leandrostl/code-compare-collectionssingletonlist-vs-listof-385?1如有侵犯,请联系[email protected]删除
最新教程 更多>

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3