今天使用List时出现java.lang.UnsupportedOperationException
代码如下:
List<String> lists = Collections.emptyList();
lists.add("aa");
lists.add("cc");
lists.add("bb");
运行出现
Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.AbstractList.add(AbstractList.java:148)
at java.util.AbstractList.add(AbstractList.java:108)
随后查看了下源码 , 大致发现了原因 , 在Collections
类中 ,定义了一个final
常量EMPTY_LIST
,默认创建了实例EmptyList
, 随后在调用Collections.emptyList()
过程中 , 将该常量EMPTY_LIST
返回 ,而EmptyList
类并没有add()
方法 , 如图:
EMPTY_LIST常量:
EmptyList类源码:
/**
* @serial include
*/
private static class EmptyList<E>
extends AbstractList<E>
implements RandomAccess, Serializable {
private static final long serialVersionUID = 8842843931221139166L;
public Iterator<E> iterator() {
return emptyIterator();
}
public ListIterator<E> listIterator() {
return emptyListIterator();
}
public int size() {return 0;}
public boolean isEmpty() {return true;}
public boolean contains(Object obj) {return false;}
public boolean containsAll(Collection<?> c) { return c.isEmpty(); }
public Object[] toArray() { return new Object[0]; }
public <T> T[] toArray(T[] a) {
if (a.length > 0)
a[0] = null;
return a;
}
public E get(int index) {
throw new IndexOutOfBoundsException("Index: "+index);
}
public boolean equals(Object o) {
return (o instanceof List) && ((List<?>)o).isEmpty();
}
public int hashCode() { return 1; }
@Override
public boolean removeIf(Predicate<? super E> filter) {
Objects.requireNonNull(filter);
return false;
}
@Override
public void replaceAll(UnaryOperator<E> operator) {
Objects.requireNonNull(operator);
}
@Override
public void sort(Comparator<? super E> c) {
}
// Override default methods in Collection
@Override
public void forEach(Consumer<? super E> action) {
Objects.requireNonNull(action);
}
@Override
public Spliterator<E> spliterator() { return Spliterators.emptySpliterator(); }
// Preserves singleton property
private Object readResolve() {
return EMPTY_LIST;
}
}
emptyList()方法:
所以 Collections.EMPTY_LIST
or Collections.emptyList()
返回的这个空的List是不能进行添加元素这类操作的 , 我试了size()是可以的 , 还没完全弄透彻 , 持续更新…