![](/img/trans.png)
[英]Why does Collections.sort(List) work in Java 8 with CopyOnWriteArrayList but not in Java 7?
[英]How does Collections.sort(…) work?
为了清楚起见,我试图找出Collections.sort(list,new MyComp())方法如何按顺序调用compare方法。
我有一个带有雇员及其个人号码(k)的LinkedList:这些号码是:{1,2,3,4,5,6} MyComparator中的compare(Object o1,Object o2)方法返回一些数字(即与该问题无关)。 sort()如何调用方法比较? 它使用参数1,2然后,2,3然后3,4然后4,5然后5,6来调用它吗? 我调试了它,但是有一些奇怪的序列,它跳回去并且还比较了1,3。
它到底有什么比较? 有图案吗?
进行的具体比较取决于在内部使用Collections.sort
方法对元素进行排序的算法。 根据Javadoc for Collections.sort
:
此类中包含的多态算法文档通常包括对实现的简要说明。 此类描述应被视为实现说明,而不是说明书的一部分。 只要遵守规范本身,实现者就可以随意替换其他算法。 (例如,sort使用的算法不必是mergesort,但必须是稳定的。)
换句话说,Java实现可以自由使用他们想要的任何排序算法,只要它以相同的相对顺序保持相等的元素即可。 这意味着,如果没有更多关于您特定Java实现的知识,就无法知道将进行哪些比较。 (如果我没记错的话,Oracle的Java版本实际上将其Collections.sort
实现从Java 7切换到了Java 8,尽管我可能会误会。)
也就是说,这不是一件坏事。 编写比较器背后的想法是告诉排序方法“做任何需要做的事情来对事物进行排序,如果需要进行比较,这就是做到这一点的方法。” 这是一个很好的抽象-您说了如何对事物进行排名,然后魔术排序的黑匣子就开始使用它来使事物井然有序。
Java 7中Collections.sort的排序算法是插入排序。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.