Java必知必会:Collections工具类的使用

Collections工具类的使用

背景

Collections类所在的包为java.util包,支持程序员获取空集合、创建同步集合、创建不可变的集合,提供了大量静态方法便于使用。本文描述和示例,均在jdk 1.8的环境下。

获取空集合

有些时候,方法需要返回一个集合结果,比如列表给调用方,如果返回结果可能为null,则调用者在后续操作时还需要额外判断null进行处理,不太方便,此时可以考虑利用Collections类返回一个空的集合。
不佳实践样例

	private int userCount = 0;

    public List<String> getAllUserName(){
        return userCount == 0 ? null : Arrays.asList("张三", "李四");
    }

上述样例方法中可能返回null,那么调用者要额外判断得到的结果是否为null,不为null才能进行后续迭代使用。

    List<String> resList = getAllUserName();
    if (resList != null) {
        for (String s : resList) {
            System.out.println(s);
        }
    }

Collections类的empty系列方法
在这里插入图片描述
上述方法会返回一个对应类型的空集合,该集合不可变,不能进行写操作,比如add、put

  public static void main(String[] args) {
       List<String> emptyList = Collections.emptyList();
       Map<String, String> emptyMap = Collections.emptyMap();
       Set<String> emptySet = Collections.emptySet();
   }

创建同步集合

平常使用的集合容器一般都不是同步的,多线程并发读写的时候,存在线程安全问题,比如ArrayList、LinkedList、HashMap、LinkedHashMap、TreeMap、HashSet、LinkedHashSet、TreeSet,并发量不高的情况下,可以考虑使用Collections类创建同步集合,把一个线程不安全的容器包装成只能线程同步访问操作的容器。
Collections类的synchronized系列方法
在这里插入图片描述

public static void main(String[] args) {
        // 得到一个线程安全的list,
        List<String> synchronizedList = Collections.synchronizedList(new ArrayList<String>());
}

方法内部是创建一个“同步容器”,利用synchronized关键字对原始容器的所有方法加锁,而且锁对象是同一个,所以多线程方法操作“同步容器”时,达到串行访问的效果,实现线程安全的效果。
在这里插入图片描述
在这里插入图片描述
额外要注意:使用迭代器或者流去迭代处理该“同步集合”时,多线程环境下,必须额外对该“同步集合”做同步,就是对它加锁,避免在迭代过程中发生并发修改异常。
在这里插入图片描述

创建不可变集合

有的时候,字典是常量,用于判断或者校验输入数据的合法性,可以用不可变集合做初始化,后续直接使用。
不可变集合的特性就是初始化完毕之后,不再支持写操作,是只读的。
Collections类的unmodifiable系列方法
在这里插入图片描述

// 这个list是只读的,不可写(比如add,set)
    public static List<Integer> statusCodes = Collections.unmodifiableList(Arrays.asList(200, 403, 404, 500));
    //
    public static void main(String[] args) {
        int status = 600;
        if(!statusCodes.contains(status)){
            throw new IllegalArgumentException();
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值