• Java之Collections.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报异常就对啦。

    下面简单看下这个源码:

    [java] view plain copy
     
    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等等。具体看下图,都是一个套路。

  • 相关阅读:
    nginx(二)----ubuntu14.04下启动或重启和关闭nginx
    nginx(一)----ubuntu14.04下安装nginx
    ubuntu安装和查看已安装
    《太阳照常升起》
    [原]Jenkins(十四)---jenkins示例:admin管理所有项目,新建用户只能看部分项目
    第十二节:Nginx的简介、三种轮询配置方式、以及解决微服务架构负载均衡问题
    第一节:CDN、SLB、DNS(4层和7层)、IOT
    第三十节:Asp.Net Core中JWT刷新Token解决方案
    第六节:秒杀业务/超卖的几种解决思路
    第五节: Redis架构演变历程和cluster集群模式架构的搭建
  • 原文地址:https://www.cnblogs.com/qiumingcheng/p/7126281.html
Copyright © 2020-2023  润新知