今天在看大佬写的代码的时候,结果集为空的情况,他返回的不是null,而是:
return Collections.EMPTY_LIST;
我们都知道返回null,很有可能造成空指针异常,可以使用emptyList
或EMPTY_LIST
就可以避免这个问题,除非你想捕获这个为空的信息
我们在使用emptyList
空的方法返回空集合的时候要注意,这个空集合是不可变的。
空的集合不可以使用add方法,会报UnsupportedOperationException
异常,看如下源码:
public void add(int index, E element) {
throw new UnsupportedOperationException();
}
空集合对象不可以使用put方法,会报IndexOutOfBoundsException异常,看如下源码:
public E get(int index) {
throw new IndexOutOfBoundsException("Index: "+index);
}
但是对于for循环都不会发生异常,如下的示例:
List<String> list1 = Collections.emptyList();
for(String s:list1) {
}
for(int i=0;i<list1.size();i++) {
}
上面的两种for循环都可以正常的执行,第一种foreach循环,实际编译之后会变成迭代器的模式,这样我们就好理解为什么可以正常执行;第二种是只调用了size方法,我们可以看到源码直接返回0;
public int size() {return 0;}
emptyList和EMPTY_LIST的区别,我们看下源码:
/**
* The empty list (immutable). This list is serializable.
*
* @see #emptyList()
*/
@SuppressWarnings("unchecked")
public static final List EMPTY_LIST = new EmptyList<>();
/**
* Returns the empty list (immutable). This list is serializable.
*
* <p>This example illustrates the type-safe way to obtain an empty list:
* <pre>
* List<String> s = Collections.emptyList();
* </pre>
* Implementation note: Implementations of this method need not
* create a separate <tt>List</tt> object for each call. Using this
* method is likely to have comparable cost to using the like-named
* field. (Unlike this method, the field does not provide type safety.)
*
* @see #EMPTY_LIST
* @since 1.5
*/
@SuppressWarnings("unchecked")
public static final <T> List<T> emptyList() {
return (List<T>) EMPTY_LIST;
}
我们看到EMPTY_LIST 是Collections类的一个静态常量,而emptyList是支持泛型的。若是不需要泛型的地方可以直接使用 EMPTY_LIST ,若是需要泛型的地方就需要使用emptyList。
通过上面的分析我们可以很清楚的知道什么时候使用emptyList;Collections集合中还有其它的几种空集合emptyMap、emptySet,他们的使用方法跟上面的大同小异。
如果文章对你有帮助,不要忘了给我点个赞吼( ̄▽ ̄)~
欢迎关注我的微信公众号:松鼠技术站