使用Java的Collections.singletonList()吗?


164

Collections.singletonList()Java中有什么用?我了解它会返回一个包含一个元素的列表。我为什么要有一个单独的方法来做到这一点?不变性在这里如何发挥作用?

此方法是否有任何特殊有用的用例,而不仅仅是便捷的方法?


6
这里的例子是如何可能是有用的- stackoverflow.com/a/1239631/360811
shabunc


1
@sschuberth,请比较问题的日期。OP不知道她/他可能会重复一个未来的问题
KumarAnkit

的确,@ KumarAnkit,但是指向重复项的链接对于寻找替代/可能更好答案的人们仍然有用。实际上,我认为将重复链接视为双向事物,并且无论这些问题是旧的还是新的,都应保留更好的问题/答案。
sschuberth'4

@sschuberth,很好,但是应该归为类似问题,例如这里的问题。
KumarAnkit

Answers:


159

javadoc中这样说:

“返回仅包含指定对象的不可变列表。返回的列表是可序列化的。”

你问:

我为什么要有一个单独的方法来做到这一点?

主要是为了方便...省去编写以下语句的麻烦:

  • 创建一个空列表对象
  • 向其添加元素,并
  • 用不可变的包装器包装它。

它也可能会更快一些和/或节省一些内存,但是这些少量的节省不太可能是可观的。(至少可以说,创建大量单例列表的应用程序是不寻常的。)

不变性在这里如何发挥作用?

它是方法规范的一部分;往上看。

此方法是否有任何特殊有用的用例,而不仅仅是一种便捷方法?

显然,在一些用例中使用该singletonList方法很方便。但是我不知道您如何(客观地)区分普通用例和“特别有用”的用例...


26

这是关于单例方法的一种观点

我发现这些各种“单一”方法对于将单个值传递给需要该值集合的API很有用。当然,当处理传入值的代码不需要添加到集合中时,这种方法效果最好。


您能帮我理解上述评论的这一部分吗?“当然,当处理传入值的代码不需要添加到集合中时,这种方法效果最好。” 我没听懂
Bilbo Baggins

2
我认为他指的是无法修改传入列表,因为它是一个不变的列表。
丹尼尔·希格拉斯

2
@BilboBaggins-该声明具有讽刺意味。:-)短语“在...时最有效”更准确地写为“仅在...时才有效”。
斯蒂芬·C

18

从javadoc

@param  the sole object to be stored in the returned list.
@return an immutable list containing only the specified object.

import java.util.*;

public class HelloWorld {
    public static void main(String args[]) {
        // create an array of string objs
        String initList[] = { "One", "Two", "Four", "One",};

        // create one list
        List list = new ArrayList(Arrays.asList(initList));

        System.out.println("List value before: "+list);

        // create singleton list
        list = Collections.singletonList("OnlyOneElement");
        list.add("five"); //throws UnsupportedOperationException
        System.out.println("List value after: "+list);
    }
}

当代码需要一个只读列表,但您只想在其中传递一个元素时,可以使用它。singletonList是(线程)安全且快速的。


谢谢,这是更好的答案。您甚至可以举一个例子,而不是简单地说“显然有用例,但我不知道这些用例”。
程序员

3

要回答您的一成不变的问题:

Collections.singletonList将创建一个不可变的列表。不变列表(也称为不可修改列表)不能更改其内容。如果您尝试更改内容,则添加或删除项目的方法将引发异常。

单例列表仅包含该项目,无法更改。


2

如果不可变/单一集合是指仅具有一个对象并且没有被进一步修改的集合,则可以通过使仅具有一个对象的集合“ UnmodifiableCollection”来实现相同的功能。由于无法修改的集合可以用一个对象实现相同的功能,那么Singleton集合有什么特殊用途?


以“正常”方式并使用单例方法创建一个对象无法修改的集合。然后,您立即看到原因。
kap 2014年

1

singletonList可以保存任何对象的实例。对象状态可以修改。

List<Character> list = new ArrayList<Character>();
list.add('X');
list.add('Y');
System.out.println("Initial list: "+ list);
List<List<Character>> list2 = Collections.singletonList(list);
list.add('Z');
System.out.println(list);
System.out.println(list2);

我们不能像上面一样定义unmodifiableList。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.