请问各位大侠,Collections 提供不可修改集合的目的是什么?
List<String> list = java.util.Collections.EMPTY_LIST;
list.add("12");抛异常:Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.AbstractList.add(AbstractList.java:131)
at java.util.AbstractList.add(AbstractList.java:91)
at com.mapbar.effective.Effective.main(Effective.java:12)
因为设计都成静态并且不可修改的集合。
public static final List EMPTY_LIST = new EmptyList(); private static class EmptyList
extends AbstractList<Object>
implements RandomAccess, Serializable {
// use serialVersionUID from JDK 1.2.2 for interoperability
private static final long serialVersionUID = 8842843931221139166L; public int size() {return 0;} public boolean contains(Object obj) {return false;} public Object get(int index) {
throw new IndexOutOfBoundsException("Index: "+index);
} // Preserves singleton property
private Object readResolve() {
return EMPTY_LIST;
}
}
List<String> list = java.util.Collections.EMPTY_LIST;
list.add("12");抛异常:Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.AbstractList.add(AbstractList.java:131)
at java.util.AbstractList.add(AbstractList.java:91)
at com.mapbar.effective.Effective.main(Effective.java:12)
因为设计都成静态并且不可修改的集合。
public static final List EMPTY_LIST = new EmptyList(); private static class EmptyList
extends AbstractList<Object>
implements RandomAccess, Serializable {
// use serialVersionUID from JDK 1.2.2 for interoperability
private static final long serialVersionUID = 8842843931221139166L; public int size() {return 0;} public boolean contains(Object obj) {return false;} public Object get(int index) {
throw new IndexOutOfBoundsException("Index: "+index);
} // Preserves singleton property
private Object readResolve() {
return EMPTY_LIST;
}
}
系统启动,会将一些经常用到的,数据又不常改动的表数据,加载到内存里。为了防止别人改变此List或Map,就使其不可修改:Collections.unmodifiableMap(xxxMap);
ThreadPoolExecutor保存任务的队列有三种 分别是无界队列、有界队列和一个无法添加任何元素进去的队列(java.util.concurrent.SynchronousQueue<E>) 当为此线程池选择队列的时候 如果选择最后这个队列 那么任务不会进入队列而是直接启动一个新线程我想你EMPTY_LIST也是有作用的 虽然俺想不出他是用在哪里的..(3L有道理..)