为什么Collections.sort(List)在带有CopyOnWriteArrayList的Java 8中起作用,而在Java 7中却不起作用?

为什么Collections.sort(List)在带有CopyOnWriteArrayList的Java 8中起作用,而在Java 7中却不起作用?,第1张

为什么Collections.sort(List)在带有CopyOnWriteArrayList的Java 8中起作用,而在Java 7中却不起作用?

Java 7(以及Java 8的早期版本)和Java
8u20之间的

Collections.sort
工作方式有所不同(Holger指出,版本8032636)。


Java 7

Collections.sort(list,c)
指定:

此实现将指定的列表转储到数组中,对数组进行排序,然后遍历列表,从数组中的相应位置重置每个元素。这样可以避免由于尝试对链表进行适当排序而导致的n²log(n)性能。

查看代码,这是通过

ListIterator
从列表中获取a
来完成的。但是,
CopyOnWriteArrayList

listIterator()
方法指出返回的迭代器不支持该
set
*** 作:

返回的迭代器在构造迭代器时提供列表状态的快照。在遍历迭代器时不需要同步。 该迭代器不支持

remove
set
add
方法

这说明了使用Java
7运行代码时遇到的错误。作为解决方法,您可以参考此问题,答案是将列表的内容转储到数组中,对数组进行排序并将元素放回清单。


在Java 8中,

Collections.sort(list,c)
更改了实现:

此实现遵循

List.sort(Comparator)
使用指定列表和比较器的方法。

并且新方法

CopyOnWriteArrayList.sort(c)
(Java 8中引入)不使用列表迭代器,因此它可以正常工作。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5616117.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存