Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.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中set与Java中List的性能比较_Java_Collections_Java 8 - Fatal编程技术网

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