gpt4 book ai didi

java - 为什么 Collections.sort(List) 在 Java 8 中使用 CopyOnWriteArrayList 而在 Java 7 中不起作用?

转载 作者:搜寻专家 更新时间:2023-10-30 21:47:28 24 4
gpt4 key购买 nike

我可以使用以下代码和 Java 8 毫无问题地对用户列表进行排序:

CopyOnWriteArrayList<User> allCurrentLoginnedUsersList = new CopyOnWriteArrayList<>(); 
Collections.sort(allCurrentLoginnedUsersList);

现在,我更改为 Java 7,并且在 eclipse 上没有看到任何错误。但是现在,在 Java 7 下运行时出现了这个错误:

java.lang.UnsupportedOperationException
at java.util.concurrent.CopyOnWriteArrayList$COWIterator.set(CopyOnWriteArrayList.java:1049)
at java.util.Collections.sort(Collections.java:221)
at com.fluent.User.sortAllCurrentLoginnedUsers(User.java:446)

如何解决?

最佳答案

在 Java 7(和 Java 8 的早期版本)和 Java 8u20 之间,Collections.sort 的工作方式发生了变化(issue 8032636,如 Holger 所述)。


Java 7 Collections.sort(list, c)指定:

This implementation dumps the specified list into an array, sorts the array, and iterates over the list resetting each element from the corresponding position in the array. This avoids the n² log(n) performance that would result from attempting to sort a linked list in place.

Looking at the code ,这是通过从列表中获取 ListIterator 来完成的。但是,CopyOnWriteArrayList listIterator()方法指出返回的迭代器不支持 set 操作:

The returned iterator provides a snapshot of the state of the list when the iterator was constructed. No synchronization is needed while traversing the iterator. The iterator does NOT support the remove, set or add methods.

这解释了您在使用 Java 7 运行代码时遇到的错误。作为解决方法,您可以引用 this question答案是将列表的内容转储到一个数组中,对数组进行排序并将元素放回列表中。


在 Java 8 中,Collections.sort(list, c)更改实现:

This implementation defers to the List.sort(Comparator) method using the specified list and comparator.

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

关于java - 为什么 Collections.sort(List) 在 Java 8 中使用 CopyOnWriteArrayList 而在 Java 7 中不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34827309/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com