Java Collections.singleton()返回集合而不是集合的好处是什么?

Java Collections.singleton()返回集合而不是集合的好处是什么?,java,collections,Java,Collections,返回带有该单个参数的集合,而不是集合 为什么会这样?从我所看到的,除了Set是Collection的一个子类型之外,我看不到任何优势。。。这仅仅是因为Set扩展了Collection,所以没有理由不这样做吗 是的,还有一个问题,但这是另一个问题,因为您可以使用.get()..从列表中访问随机元素。我不确定是否有“好处”或“好处”本身?它只是一个返回单例集合的方法,当您想要一个单例集合时,它恰好是默认的实现,因为单例集合也恰好是一个数学集合。不是所有的列表都是随机访问的,只需要一个链接列表(API

返回带有该单个参数的
集合,而不是
集合

为什么会这样?从我所看到的,除了
Set
Collection
的一个子类型之外,我看不到任何优势。。。这仅仅是因为
Set
扩展了
Collection
,所以没有理由不这样做吗


是的,还有一个问题,但这是另一个问题,因为您可以使用
.get()
..

列表中访问随机元素。我不确定是否有“好处”或“好处”本身?它只是一个返回单例
集合的方法,当您想要一个单例
集合时,它恰好是默认的实现,因为单例
集合也恰好是一个数学集合。

不是所有的列表都是随机访问的,只需要一个
链接列表
(API中的随机访问,而不是实现中的随机访问)作为反例。顺便说一句,我同意Louis Wasserman的观点,
集之所以有意义,是因为它更接近数学定义,感觉很自然。

我想知道同样的事情,在我的研究中遇到了你的问题。我的结论如下:

返回
集合
可以保持集合API的干净。

以下是获取单例集合的方法:

  • publicstaticset单例(to)
  • 公共静态列表singletonList(to)
  • publicstaticmap-singletonMap(K键,V值)
如果API设计人员决定使用
singletonSet
方法和
singleton
方法,该怎么办

  • 公共静态集合单例(TO)
  • publicstaticset-singletonSet(to)
  • 公共静态列表singletonList(to)
  • publicstaticmap-singletonMap(K键,V值)
singleton
方法真的有必要吗?让我们想想为什么需要这些方法

想想什么时候调用
singletonList
?您可能有一个API需要
List
,而不是
Collection
Set
。我将使用这个糟糕的示例:

public void needsList(List<?> list);
但是如果是这样的话,那么为什么要使用
列表
?一个
列表
有一个更复杂的API,并且涉及到存储索引。你真的需要索引吗?一个
集合
不够吗?我认为你应该使用一个
集合
,因为
需要一个集合
并不关心顺序

这就是
singletonSet
真正引人注目的地方。您知道,如果集合的大小为1(singleton),那么数据必须是唯一的。大小为1的集合恰好是一个集合。

不需要返回类型为
集合
的单例的方法,因为它意外地是一个

不可变的
Set< Employee > ceo = Collections.singleton( new Employee( "Tim Cook" ) ) ;  // Always exactly one item in this context, only one CEO is possible.

ceo.add( … ) ;     // Fails, as the collection is immutable.
ceo.clear() ;      // Fails, as the collection is immutable.
ceo.remove( … ) ;  // Fails, as the collection is immutable.

someReport.processEmployees( ceo ) ;
好处体现在读入的第一个形容词中:不可变

有时,您使用的代码需要一个列表(或
列表
,等等)。在您自己的上下文中,您可能只需要一个项目。要实现您自己的目标,即在需要在一个集合中呈现该项目的同时强制执行单个项目的规则,请使用禁止您添加多个项目的
set
实现

“不可变”是指,一旦创建,生成的
Set
对象保证有一个,并且只有一个项。不为零,也不超过一个。不能添加更多项。不能删除一个项

例如,假设您的代码与代表CEO(首席执行官)的
员工
对象一起工作您的代码明确地只处理CEO,因此您知道一次只能有一个这样的
员工
对象,始终是一个CEO。但您希望利用一些现有代码为指定的
员工
对象集合创建报告。使用
集合.singleton
就可以了保证您自己的代码不会错误地只有一名员工,同时仍然能够传递
集合

Set< Employee > ceo = Collections.singleton( new Employee( "Tim Cook" ) ) ;  // Always exactly one item in this context, only one CEO is possible.

ceo.add( … ) ;     // Fails, as the collection is immutable.
ceo.clear() ;      // Fails, as the collection is immutable.
ceo.remove( … ) ;  // Fails, as the collection is immutable.

someReport.processEmployees( ceo ) ;
但是
方法的同级
被重载,以接受不可变集合中的任意数量的元素,而不仅仅是一个元素

Set< Pet > pet = Set.of( someDog ) ;
Set< Pet > pets = Set.of( someDog , someOtherDog , someCat ) ;
Setpets=Set.of(someDog,someOtherDog,someCat);

存在单例收集的原因是,如果您知道要存储1个元素,并且它不会发生变异,则可以提供低内存收集。特别是在大容量服务中,由于垃圾收集延迟,这可能会产生重大影响

这适用于
Set.of(“1”);
Collections.singleton(“1”);

由于
Set
是一个
集合
已经返回了约束更严格的契约,这对库的用户来说是一件好事。 您无需支付任何费用即可获得附加功能

作为用户,您应该像对待任何其他API和库一样,为它存储最不需要的契约


因此,如果你需要对结构做的唯一一件事就是循环迭代,我建议你选择
Iterable
,而不是使用
List
Set
Collection
。因为
Collection
Iterable
,这将是现成的。

对不起,
List
合同要求您可以从任何索引中
.get()
。无论大O意味着什么,但这是一项要求。基本上,这就是对元素的随机访问。
ArrayList
实现了
RandomAccess
LinkedList
没有。请参阅Javadoc。随机访问隐式地意味着