在这一系列帖子中,我正在比较编写相同功能的不同方法。上一篇文章比较了 Collections.singletonList 和 ArrayList 创建单元素列表的方法。
在这篇文章中,我将比较 Collections.singletonList 与另一个著名的工厂方法 List.of。
公共静态
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 的优点,但回顾一下:
静态
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 中引入,距 singletonList 17 年。
有趣的是,与 SingletonList 不同,它有注释:
返回一个不可变列表仅包含指定的对象。
Array.of 声明它是一个 不可修改的列表:
返回包含一个元素的不可修改列表。
这反映了对集合不变性的新理解。根据此文档:
如果元素无法添加、删除或替换,则集合被视为不可修改。但是,只有当集合中包含的元素不可变时,不可修改的集合才是不可变的。
尽管术语存在差异,但这两种工厂方法具有几乎相同的功能。深入查看 UnmodifyingList 内部,我们可以发现:
static <E> List<E> of(E e1) { return new ImmutableCollections.List12<>(e1); }
令人惊讶的是,他们使用了不太精确的术语不可变,不过!
static final class List12<E> extends AbstractImmutableList<E> 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<E> extends AbstractImmutableCollection<E> implements List<E>, 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<E> 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 工厂方法来创建单元素列表。我们讨论了 immutable 和 unmodulated 的语义,并表明这两种方法都是高效、简洁且资源轻的。如果您可以使用更新的 Java 版本,那么它会更受欢迎,因为它熟悉、清晰,而且因为我们使用 List 接口的次数比 Collection 多得多。如果仅限于较旧的 Java 版本,Collections.singletonList 仍然是一个不错的选择。
以上是[代码比较] Collections.singletonList 与 List.of的详细内容。更多信息请关注PHP中文网其他相关文章!