- 描述:使用Collections.EMPTY_LIST或Collections.emptyList()返回的空集合,如果进行修改会报错java.lang.UnsupportedOperationException
- 原因:Collections.EMPTY_LIST的类型为EmptyList,没有实现修改方法,实现了AbstractList类
// 类型
public static final List EMPTY_LIST = new EmptyList<>();
// 继承关系
private static class EmptyList<E>
extends AbstractList<E>
// AbstractList类中add方法
public void add(int index, E element) {
throw new UnsupportedOperationException();
}
测试代码:
public static void main(String[] args) {
List<ObjectId> nodeIds = Collections.EMPTY_LIST;
// List<ObjectId> nodeIds = new ArrayList<>();
Set<ObjectId> bizNodeIdSet = new HashSet<>();
bizNodeIdSet.add(new ObjectId("60374c158006b628960c328f"));
nodeIds.addAll(bizNodeIdSet);
System.out.println(nodeIds);
}
- 优势:
new ArrayList()创建时有初始大小,占用内存,emptyList()不用创建一个新的对象,可以减少内存开销;
方法返回一个emptyList()时,不会报空指针异常,如果直接返回Null,没有进行非空判断就会报空指针异常; - 使用建议:
返回后不对list进行修改,如果修改的话需要转换成正常的list(new ArrayList<>(EMPTY_LIST))