使用Java的Collections.singletonList()?

时间:2011-01-26 06:02:29

标签: java

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

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

6 个答案:

答案 0 :(得分:135)

javadoc说:

  

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

你问:

  

为什么我想要一个单独的方法呢?

主要是为了方便...以节省你必须写一系列陈述:

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

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

  

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

这是方法规范的一部分;见上文。

  

这种方法有没有特别有用的用例,而不仅仅是一种方便的方法?

显然,有些用例可以方便地使用singletonList方法。但我不知道你会如何(客观地)区分普通用例和“特别有用”用例......

答案 1 :(得分:25)

这是单身方法的一个view

  

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

答案 2 :(得分:11)

@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 :(得分:2)

如果Immutable / Singleton集合引用的是仅具有一个对象并且未进一步修改的集合,则可以通过使集合“UnmodifiableCollection”仅具有一个对象来实现相同的功能。由于Unmodifiable Collection可以通过一个对象实现相同的功能,因此Singleton Collection有什么特殊用途?

答案 4 :(得分:2)

回答你不可改变的问题:

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

单身人士名单仅包含该项目,不能更改。

答案 5 :(得分: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。