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();
}
}
1992

被折叠的 条评论
为什么被折叠?



