Collections.emptySet() 和 new HashSet() 的区别 以及 UnsupportedOperationException 的解决方案

背景

公司团队鉴于规范,在hashSet().size() == 0的情况下,规定使用Collections.emptySet()代替new HashSet()进行参数传递,从而引发了java.lang.UnsupportedOperationException

问题复现

    import java.util.Collections;
    import java.util.Set;

    public class UnsupportedOperationExceptionTest {
        public static void main(String[] args) {
            Set<String> emptySet = Collections.emptySet();
            emptySet.add("XX");
            System.out.println(emptySet);
        }
    }
  Exception in thread "main" java.lang.UnsupportedOperationException
  	at java.base/java.util.AbstractCollection.add(AbstractCollection.java:267)
  	at xxxxx.main(UnsupportedOperationExceptionTest .java:10)

问题分析:

new HashSet<>()Collections.emptySet()。两者都是空集,区分这两者。
一个区别是它new HashSet<>()现在是空的,但以后可能不会是空的(它可以改变,你可以向它添加东西),
而根据规范,Collections.emptySet()它们现在是空的,以后也会是空的:
你无法向它们添加任何内容,调用 .add() 将导致运行时异常,也就是java.lang.UnsupportedOperationException
Collections.emptySet()在其中返回一个静态类java.util.Collections
new HashSet<>()返回一个java.util.HashSet类。
两个集合都将为空,即实例化后 size = 0
可以通过调用.getClass()来返回来区分这两个集合。

参考资料:

https://stackoverflow.com/questions/64382398/collections-emptyset-vs-new-hashset

posted @ 2022-12-13 11:27  爱吃猫的鱼摆摆  阅读(216)  评论(0编辑  收藏  举报