Java_Collections.EMPTY_LIST

ref: http://moto0421.iteye.com/blog/1447836

1.背景

在某些情况下,我们经常需要发挥一个空的集合对象,比如说在数据查询时,并不需要发挥一个NULL或是异常,那么就可以返回一个空的集合对象。

如果你想 new 一个空的 List ,而这个 List 以后也不会再添加元素,那么就用 Collections#emptyList() 好了。 new ArrayList() 或者 new LinkedList() 在创建的时候有会有初始大小,多少会占用一内存。

假如你有很多这样的方法,那么其实可以直接返回 emptyList 了,大家共享一个对象,节省内存开销。

JDK提供了两个方式来返回集合对象,那么两者有何区别呢?那就看代码吧!

2.源码解析

//EMPTY_LIST 是Collections定义的一个静态属性,是一个类变量,可以直接返回使用  

 public static final List EMPTY_LIST = new EmptyList();  

  

//这个是emptyList的代码  

 public static final <T> List<T> emptyList() {  

    return (List<T>) EMPTY_LIST;  

    } 

从上面我们可以看出,emptyList不过是对EMPTY_LIST做了一个泛型支持。这点上我们就可以很清晰的了解两者不同的使用场景了!若是不需要泛型的情况,可以直接使用Collections,反之则使用emptyList().

3.使用

对于EMPTY_LIST就不多介绍了,我们可以直接使用Collections.EMPTY_LIST。

对于Collections.emptyList()的使用有点需要注意的地方。

若是定义了一个变量来保存这个空集合的话,那么没有问题。

List<Person> emptyPersonList = Collections.emptyList(); //编译器会自动转化。  

若是在某个场景下需要将空对象进行赋值那么就需要如下写法

organization.setPersonList(Collections.<Person> emptyList());

4.虽然在源码中存在

public int size() {return 0;}  

 public Object get(int index) {  

          throw new IndexOutOfBoundsException("Index: "+index);  

 }  

但是对于我们无论是 

 for (int i =0 ; i < ...)还是 for (Person p : personList)都不会调用到get(int index)这个方法,可以放心使用!前一种方式我们可以很好理解,因为首先是调用了size().后者foreach的实现原理还需要考究下!

注:

它不支持Add功能,调用Add会抛出unsupportedException,

在以后要返回一个空的List,并还需要后续操作时,不能使用Collections.emptyList()方法,看文档发现,List的实现类都有自己的实现,而返回的EmptyList的实现没有实现add(int index, E element方法,使用了

    AbstractList.add(int index, E element){

     throw new UnsupportedOperationException();

    }

Collections.EMPTY_MAP,Collections.EMPTY_SET 类似

猜你喜欢

转载自mikzhang.iteye.com/blog/2257123