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中引入)不使用列表迭代器,因此它可以正常工作。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)