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。随机访问隐式地意味着