gpt4 book ai didi

java - 对 CopyOnArrayList 执行排序操作会导致 java.lang.UnsupportedOperationException

转载 作者:行者123 更新时间:2023-11-30 03:40:37 25 4
gpt4 key购买 nike

为了避免并发线程修改异常,我使用了 CopyOnArrayList & 后来当我尝试使用帮助 Collection 的类排序方法对该列表进行排序时,导致了以下异常:-

线程“main”中的异常 java.lang.UnsupportedOperationException

因此,我尝试阅读可用于 CopyOnArrayList 的 javadoc

上面写着

Element-changing operations on iterators themselves (remove, set, and add) are not supported. These methods throw UnsupportedOperationException.

但据我了解,任何意义上的排序都需要在临时列表中添加和删除元素。但为什么它不这样做呢?它适用于对象克隆,因此这个因素会以任何方式产生影响。

测试代码:

package test;

import java.util.Comparator;

/**
*
* @author vaibhav.kashyap
*/
public class Student implements Comparator<Student>{

private String name = "";
private int age = -1;

public Student(){

}
public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

@Override
public int compare(Student o1, Student o2) {
return o1.getAge() <o2.getAge() ?-1:o1.getAge()==o2.getAge()?0:1;
}

}

package test;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;
import java.util.concurrent.CopyOnWriteArrayList;

/**
*
* @author vaibhav.kashyap
*/
public class Main {
List<Student> stuList = new CopyOnWriteArrayList<Student>();
public static void main(String ar[]){
List<Student> tempList = new Main().makeList();

Collections.sort(tempList, new Student());

for(Student s : tempList){
System.out.println(s.getAge());
}
}

public List<Student> makeList(){
Student stu = null;
Scanner sc = new Scanner(System.in);


for(int i=0 ; i<5; i++){
stu = new Student();
System.out.println("Enter name");
String name = sc.next();
stu.setName(name);
System.out.println("Enter age");
int age = sc.nextInt();
stu.setAge(age);
stuList.add(stu);
}

return stuList;
}
}

输出:运行:输入名字A输入年龄12输入名字乙输入年龄10输入名字C输入年龄05输入名字d输入年龄100输入名字e输入年龄01线程“main”中的异常 java.lang.UnsupportedOperationException 在 java.util.concurrent.CopyOnWriteArrayList$COWIterator.set(CopyOnWriteArrayList.java:1049) 在 java.util.Collections.sort(Collections.java:221) 在测试.Main.main(Main.java:23)Java 结果:1构建成功(总时间:30 秒)

这个概念对我来说一直很模糊。任何详细的解释都将非常感激。

最佳答案

问题是 Collections.sort() 通过获取要排序的 List 的 ListIterator 在幕后工作。然后它使用该迭代器的 set() 方法进行修改,正如 Javadoc 指出的那样,COWIterators 不支持修改操作。

为什么不强制 CopyOnWriteArrayList 实现它自己的排序方法?正如约书亚·布洛赫 (Joshua Bloch) 在 this interesting conversation 中所说的那样关于对这些列表进行排序的问题,“向广泛实现的接口(interface)(例如 List)添加方法违反了兼容性,因此这是不可能的。”此外,CopyOnWriteArrayLists 的迭代器不允许对底层列表进行修改(恕我直言),因为对这些列表的修改非常昂贵。根据某种需要对它们进行大量修改应该始终是一个经过仔细考虑的决定,(不幸的是)这似乎不受 native 支持。

关于java - 对 CopyOnArrayList 执行排序操作会导致 java.lang.UnsupportedOperationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26880648/

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