Java中set与Java中List的性能比较
考虑以下代码Java中set与Java中List的性能比较,java,collections,java-8,Java,Collections,Java 8,考虑以下代码 List<Integer> l=new ArrayList(); Set<Integer> l=new HashSet(); 或 A为add方法提供了恒定的时间性能,它在后台使用HashMap。假设某个阵列的大小为m,则总体时间复杂度为Om 如果使用ArrayList,则最坏情况下的复杂度为,其中n是列表l中的元素数。因此,总体时间复杂度为*m 因此,基于发布的代码片段,这里的集合更好,但这取决于您之后对它所做的操作以及集合是否支持它。不要担心性能。使用您
List<Integer> l=new ArrayList();
Set<Integer> l=new HashSet();
或
A为add方法提供了恒定的时间性能,它在后台使用HashMap。假设某个阵列的大小为m,则总体时间复杂度为Om
如果使用ArrayList,则最坏情况下的复杂度为,其中n是列表l中的元素数。因此,总体时间复杂度为*m
因此,基于发布的代码片段,这里的集合更好,但这取决于您之后对它所做的操作以及集合是否支持它。不要担心性能。使用您的业务所需的正确方法。考虑调用contains时会发生什么情况—您添加的每个整数最终都会与集合中的每个其他整数进行比较。这些正是HashSet设计用来避免的比较类型。Collections.addAllset,array@HolgerothersIt的效率是否至少与整数i:array set.addi;的效率相同;。但要创建一个全新的集合,您可能会做得更好:set set=newhashsetarrays.asListarray;HashSet在幕后使用HashMap这一事实与此无关。重要的是,通过内部使用的任何基于散列的实现来保证“基本操作add、remove、contains和size的恒定时间性能”。@Holger-True。它可以通过任何其他方式实现恒定时间性能。。。该规范还声明该类实现Set接口,该接口由一个哈希表(实际上是一个HashMap实例)作为第一行提供支持:。无论如何,我已经改写了我的答案。是的,但那不应该被视为是刻在石头上的。实际上,在内部使用HashMap是1.2发行计划的一个快速解决方案,甚至作者也曾说过“我不敢相信它还在使用”,因为它浪费了大量的内存。@Holger我明白了。谢谢你的观点/评论。我还没有看过Java 9的源代码,但我猜使用静态方法Set.of会返回Set的私有实现,这比HashSetYes更有效。Set.of使用完全不同的实现,因为不仅效率不同,而且基本行为也不同,不允许空值。
for(Integer i: some arrray){
if(!l.contains(i))
l.add(i);
}
for(Integer i :some array){
s.add(i);
}