• 【记录】Java两个集合取交集出现UnsupportedOperationException


    我们知道,Java 的两个集合取交集操作使用的是 retainAll() 方法,然而我在取交集时却遇到了 UnsupportedOperationException 异常,是怎么回事呢?

    代码是这样的:

    1. @SpringBootTest
    2. class SpringbootStudyApplicationTests {
    3. @Test
    4. void test0730(){
    5. String [] arr = {"1111","2222","3333","4444","5555"};
    6. List listA = Arrays.asList(arr);
    7. List listB = new ArrayList<>();
    8. listB.add("1111");
    9. listB.add("3333");
    10. // listA对listB取交集
    11. listA.retainAll(listB);
    12. System.out.println(listA);
    13. }
    14. }

    运行之后,报出以下异常:

     按照打印的异常信息,找到 AbstractCollection.retainAll() 方法,源码如下:

    1. public boolean retainAll(Collection c) {
    2. Objects.requireNonNull(c);
    3. boolean modified = false;
    4. Iterator it = iterator();
    5. while (it.hasNext()) {
    6. if (!c.contains(it.next())) {
    7. it.remove();
    8. modified = true;
    9. }
    10. }
    11. return modified;
    12. }
    13. default void remove() {
    14. throw new UnsupportedOperationException("remove");
    15. }

    请注意,该方法上有一段注释说明:Note that this implementation will throw an UnsupportedOperationException if the iterator returned by the iterator method does not implement the remove method and this collection contains one or more elements not present in the specified collection. 也就是说,iterator() 方法返回的迭代器未实现 remove() 方法,并且此集合包含指定集合中不存在的一个或多个元素,则此实现将引发 UnsupportedOperationException 异常

    到这里似乎明白了什么,迭代器未实现 remove() 方法?那需要继续看下 Arrays.asList() :

    1. public static List asList(T... a) {
    2. return new ArrayList<>(a);
    3. }

    额,Arrays 的内部类 ArrayList 集合确实没有 remove() 方法,也没有 retainAll() 方法,如下:

    那么问题来了,为什么使用 new ArrayList(); 的 ArrayList 集合却没问题呢?打开 ArrayList 集合源码看一眼也就明白了:

    至此,这个问题的原因就找到了。为了避免这种坑,我们应该正确使用 List 集合,把开始的代码改造成这样就没问题了:

    1. @SpringBootTest
    2. class SpringbootStudyApplicationTests {
    3. @Test
    4. void test0730(){
    5. String [] arr = {"1111","2222","3333","4444","5555"};
    6. List listA = new ArrayList<>(Arrays.asList(arr));
    7. List listB = new ArrayList<>();
    8. listB.add("1111");
    9. listB.add("3333");
    10. // listA对listB取交集
    11. listA.retainAll(listB);
    12. System.out.println(listA);
    13. }
    14. }

    在此记录一下~

  • 相关阅读:
    分布式任务调度项目xxl-job
    链霉亲和素修饰聚苯乙烯微球,streptavidin修饰聚苯乙烯微球
    基本算法-希尔排序
    bp神经网络有哪些模型,bp神经网络有哪些应用
    Istio 流量管理 virtualservice
    新手炒外汇,如何防止炒外汇被坑?
    四、鼎捷T100 APS产能规划计算流程
    Oracle数据库从入门到精通系列之十二:段
    【CVPR 2021】Cylinder3D:用于LiDAR点云分割的圆柱体非对称3D卷积网络
    JAVA环境下使用DATAX(不使用python调用:也是个人记录一下)
  • 原文地址:https://blog.csdn.net/qq_29119581/article/details/126078083