emptyList()、emptySet()、emptyMap()的作用

先说明一下好处有哪些:
1,如果你想 new 一个空的 List ,而这个 List 以后也不会再添加元素(有大坑,看下面更新)

那么就用 Collections.emptyList() 好了。
new ArrayList() 或者 new LinkedList() 在创建的时候有会有初始大小,多少会占用一内存。
每次使用都new 一个空的list集合,浪费就积少成多,浪费就严重啦,就不好啦
2,为了编码的方便。
比如说一个方法返回类型是List,当没有任何结果的时候,返回null,有结果的时候,返回list集合列表。
那样的话,调用这个方法的地方,就需要进行null判断。使用emptyList这样的方法,可以方便方法调用者。返回的就不会是null,省去重复代码。

 

注意的地方:
这个空的集合是不能调用.add(),添加元素的。因为直接报异常。因为源码就是这么写的:直接抛异常。

哦,Collections里面没这么写,但是EmptyList继承了AbstractList这个抽象类,里面简单实现了部分集合框架的方法。
这里面的add方法最后调用的方法体,就是直接抛异常。
throw new UnsupportedOperationException();
这么解释add报异常就对啦。

 

下面简单看下这个源码:

 

 
  1. /**

  2. * Collections 类里面的方法如下,一步步往下看就是啦

  3. */

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

  5. return (List<T>) EMPTY_LIST;

  6. }

  7. //。。。。。

  8. /**

  9. * Collections 类里面的方法如下,一步步往下看就是啦

  10. */

  11. public static final List EMPTY_LIST = new EmptyList<>();

  12. //。。。。。

  13. /**

  14. * Collections里面的一个静态内部类

  15. */

  16. private static class EmptyList<E> extends AbstractList<E> implements RandomAccess, Serializable {

  17. private static final long serialVersionUID = 8842843931221139166L;

  18.  
  19. public Iterator<E> iterator() {

  20. return emptyIterator();

  21. }

  22. public ListIterator<E> listIterator() {

  23. return emptyListIterator();

  24. }

  25.  
  26. public int size() {return 0;}

  27. public boolean isEmpty() {return true;}

  28.  
  29. public boolean contains(Object obj) {return false;}

  30. public boolean containsAll(Collection<?> c) { return c.isEmpty(); }

  31.  
  32. public Object[] toArray() { return new Object[0]; }

  33.  
  34. public <T> T[] toArray(T[] a) {

  35. if (a.length > 0)

  36. a[0] = null;

  37. return a;

  38. }

  39.  
  40. public E get(int index) {

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

  42. }

  43.  
  44. public boolean equals(Object o) {

  45. return (o instanceof List) && ((List<?>)o).isEmpty();

  46. }

  47.  
  48. public int hashCode() { return 1; }

  49.  
  50. // Preserves singleton property

  51. private Object readResolve() {

  52. return EMPTY_LIST;

  53. }

  54. }

 

除了这个emptyList,之外,还有类似的,emptyMap,emptySet等等。具体看下图,都是一个套路。

 

 

(2017/08/28 更新)

看下面的代码,咱先弄个empty出来,然后,可能有需求要继续在这个空集合里面添加内容。那么,bug就来啦。

 

 
  1. /**

  2. * 测试这个空集合是某个Java bean 的某个属性的时候的操作,也是不能add的

  3. */

  4. private static void testModelEmptyField() {

  5. Car car = new Car();

  6. car.setBoys(Collections.emptyList());

  7. car.getBoys().add("sss");

  8. }

  9.  
  10. /**

  11. * Collections.emptyMap() 返回的空集合是不能进行put的

  12. */

  13. private static void testEmptyMap() {

  14. Map<String,String> map = Collections.emptyMap();

  15. for (Map.Entry<String, String> entry : map.entrySet()) {

  16. System.out.println(entry.getKey() + ":"+ entry.getValue());

  17. }

  18. map.put("a","a");

  19. for (Map.Entry<String, String> entry : map.entrySet()) {

  20. System.out.println(entry.getKey() + ":"+ entry.getValue());

  21. }

  22. }

  23.  
  24. /**

  25. * Collections.emptyList() 返回的空集合是不能进行add的

  26. */

  27. private static void testEmptyList() {

  28. List<String> list = Collections.emptyList();

  29. for (String s : list) {

  30. System.out.println(s);

  31. }

  32. //异常

  33. list.add("1");

  34. for (String s : list) {

  35. System.out.println(s);

  36. }

  37. }


具体出的bug,看下面的截图。

 

阿弥陀佛,算了 ,这个咱还是不用了吧。

很危险的,分分钟代码就bug啦。这个不好,不好。。。不用啦,了解下就得啦。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值