Collections的emptyList() emptyMap() emptySet()

Collections的emptyList() emptyMap() emptySet()

在看Collections时看到这三个方法

Collections.emptySet() 
Collections.emptyList() 
Collections.emptyMap()

会生成指定类型的空List Set Map,而且是不可变的,如进行add()操作会报java.lang.UnsupportedOperationException,返回这样不可变的空集合有什么作用呢?

  • 方法内部会返回static final成员,创建后相当于常量可重复引用,当需要使用一个空集合时不用new去分配内存,比如一个测试用例API接口就需要一个Map<String,Object>,若此时只需要一个空map跑用例,直接用Collections.emptyMap()作为参数即可

  • 防止空指针出现,当你的代码需要一个集合而这个集合可能不存在,此时尽量使用空集合而不是null,因为集合一个常用的操作就是遍历,你不知道你返回的结果在后续会不会被遍历。比如一个查询步骤返回一个集合,当返回一个空集合是就可以用这类方法,还可以防止后续对这个空集合再做add操作

参考Effactive JAVA 43条:返回0长度的数组或者集合,而不是null

  • 对于泛型集合无需指定其类型参数,如Map<Foo, Comparable<? extends Bar>> fooBarMap = new HashMap<Foo, Comparable<? extends Bar>>(); 只要Map<Foo, Comparable<? extends Bar>> fooBarMap = Collections.emptyMap();即可,起到简化代码作用

  • 使用集合的一个好习惯就是使用 immutable collection,参考 http://stackoverflow.com/questions/214714/mutable-vs-immutable-objects/214718#214718

    @Test
    public void test_emptySet()
    {
        Set<String> s1 = new HashSet<String>();
        Set<File> s2 = new LinkedHashSet<File>();
        Set<Integer> s3 = new TreeSet<Integer>();
        assertTrue(s1.equals(Collections.emptySet()));
        assertTrue(s2.equals(Collections.emptySet()));
        assertTrue(s3.equals(Collections.emptySet()));
    
        s1.add("abc");
        assertFalse(s1.equals(Collections.emptySet()));
    
        s1.clear();
        assertTrue(s1.equals(Collections.emptySet()));
    }
    

参考

http://www.cnblogs.com/booth-sun/p/5625764.html

https://coderanch.com/t/536728/java/java/Collections-emptySet-Collections-emptyList-Collections

http://stackoverflow.com/questions/14846920/collections-emptymap-vs-new-hashmap

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值