使用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-那句话很讽刺。:-)“这在……时最有效”这句话写得更准确:“这只在……时才有效。”谢谢,这是更好的答案。你甚至给出了一个例子,而不是简单地说“显然有用例,但我不知道它们”。