栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

有什么更有效的方法:对流进行排序或对列表进行排序?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

有什么更有效的方法:对流进行排序或对列表进行排序?

可以肯定地说,两种形式的排序都将具有相同的复杂性……即使不看代码也是如此。(如果他们不这样做,那么一种形式将被严重破坏!)

查看流的Java
8源代码(特别是内部类

java.util.stream.SortedOps
),该
sorted()
方法将一个组件添加到流管道中,该组件将所有流元素捕获到数组或
ArrayList

  • 当且仅当管道装配代码可以提前推断出流中元素的数量时,才使用数组。

  • 否则,将

    ArrayList
    使用an 来收集要排序的元素。

如果

ArrayList
使用,则将产生构建/扩展列表的额外开销。

然后我们返回代码的两个版本:

List<Item> sortedItems = new ArrayList<>(items);Collections.sort(sortedItems, itemComparator);

在此版本中,

ArrayList
构造函数将元素复制
items
到适当大小的数组,然后
Collections.sort
对该数组进行就地排序。(这发生在幕后)。

List<Item> sortedItems = items    .stream()    .sorted(itemComparator)    .collect(Collectors.toList());

在此版本中,如我们上面所见,与代码关联的代码

sorted()
要么构建并对数组进行排序(等效于上面发生的事情),要么构建
ArrayList
慢速方式。但最重要的是,有往返
items
于收集器的数据流开销。

总的来说(至少使用Java
8实现)代码检查告诉我,代码的第一个版本不能比第二个版本慢,并且在大多数(如果不是全部)情况下,它会更快。但是随着列表的增加,

O(NlogN)
排序将趋于主导
O(N)
复制的开销。这意味着两个版本之间的
相对 差异将变小。

If you really care, you should be able to write a benchmark to test the actual
difference with a specific implementation of Java, and a specific input
dataset. (Or adapt @Eugene’s benchmark!)



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/431160.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号