Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Java';s Collections.singletonList()?_Java - Fatal编程技术网

使用Java';s Collections.singletonList()?

使用Java';s Collections.singletonList()?,java,Java,Collections.singletonList()在Java中有什么用途?我知道它返回一个包含一个元素的列表。为什么我想有一个单独的方法来做呢?不变性是如何在这里发挥作用的 这种方法有没有什么特别有用的用例,而不仅仅是一种方便的方法?这里有一个关于单例方法的用例: 我发现这些不同的“单例”方法对于将单个值传递给需要该值集合的API非常有用。当然,当处理传入值的代码不需要添加到集合中时,这种方法效果最好 报告说: “返回仅包含指定对象的不可变列表。返回的列表可序列化。” 你问: 为什么我想有一

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

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

这里有一个关于单例方法的用例:

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

报告说:

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

你问:

为什么我想有一个单独的方法来做呢

主要是为了方便。。。为了避免您必须编写一系列语句:

  • 创建一个空列表对象
  • 向其中添加一个元素,然后
  • 用一个不可变的包装器包装它
它也可能快一点和/或节省一点内存,但这些小的节省不太可能是显著的。(至少可以说,创建大量单例列表的应用程序是不寻常的。)

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

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

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


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

如果不可变/单例集合指的是只有一个对象且未进一步修改的集合,则可以通过将集合设置为只有一个对象的“不可修改集合”来实现相同的功能。由于使用一个对象进行不可修改的集合可以实现相同的功能,那么Singleton集合有什么特殊用途呢?

来自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);
    }
}

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

要回答您不变的问题:

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


单例列表仅包含该项,不能更改。

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

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);
List List=new ArrayList();
列表。添加('X');
列表。添加('Y');
System.out.println(“初始列表:“+列表”);
List list2=集合。singletonList(列表);
列表。添加('Z');
系统输出打印项次(列表);
System.out.println(列表2);

我们不能像上面那样定义不可修改列表。

下面是一个如何使用它的示例-可能重复@sschuberth,请比较问题的日期。OP不知道他/她可能会复制一个未来的问题True,@KumarAnkit,但重复的链接对于寻找替代/潜在更好答案的人仍然有用。事实上,我认为作为重复链接应该被视为一种双向的东西,更好的问题/答案应该被保留,无论这些问题/答案是旧的还是新的。@sschuberth,很好的观点,但它应该被归类为类似的问题,就像这里的这个问题。创建一个不可修改的集合,其中一个对象是“正常的”方法和使用单例方法。那么你马上就明白为什么了。你能帮我理解上面评论的这一部分吗?“当然,当处理传入值的代码不需要添加到集合中时,这种方法最有效。”我没有得到它。我想他指的是不能修改传入列表,因为它是一个不可变的列表。@Bilbobagkins-那句话很讽刺。:-)“这在……时最有效”这句话写得更准确:“这只在……时才有效。”谢谢,这是更好的答案。你甚至给出了一个例子,而不是简单地说“显然有用例,但我不知道它们”。