java.util.Collections类—emptyList()方法的使用

 更新时间:2021年11月17日 08:46:11   作者:DobyJin  
这篇文章主要介绍了java.util.Collections类—emptyList()方法的使用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

Collections是列表的工具类,其中有好多方便实用的方法。主要是对列表的查找、替换、排序、反转等操作。今天介绍一下emptyList()方法的使用,因为这个方法有一个大坑!

emptyList()方法的使用

通过java.util.Collections.emptyList()方法的相关源码可以得知它实际上就是返回了一个空的List,但是这个List和我们平时常用的那个List是不一样的。这个方法返回的List是Collections类的一个静态内部类,它继承AbstractList后并没有实现add()、remove()等方法,因此这个返回值List并不能增加删除元素。

既然这个List不能进行增删操作,那么它有何意义呢?

这个方法主要目的就是返回一个不可变的列表,使用这个方法作为返回值就不需要再创建一个新对象,可以减少内存开销。并且返回一个size为0的List,调用者不需要校验返回值是否为null,所以建议使用这个方法返回可能为空的List。

emptySet()、emptyMap()方法同理。

   /**
     * The empty list (immutable).  This list is serializable.
     *
     * @see #emptyList()
     */
    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&lt;String&gt; 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
     */
    public static final <T> List<T> emptyList() {
    return (List<T>) EMPTY_LIST;
    }
    /**
     * @serial include
     */
    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;
        }
    }

java.util.Collections.emptyList()方法的测试

public class CollectionsTest {
    public static void main(String[] a) {
        List<Integer> list = new ArrayList<Integer>();
        list.add(1);
        list.add(2);
        System.out.println(list);
        list = Collections.emptyList();
        System.out.println(list);
        list.add(3);
    }
}
//执行结果
[1, 2]
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.jiuqi.pay.importfile.test.CollectionsTest.main(CollectionsTest.java:22)

Java Collections.emptyList()方法的注意事项

emptyList()

作用:返回一个空的List(使用前提是不会再对返回的list进行增加和删除操作);

好处

1. new ArrayList()创建时有初始大小,占用内存,emptyList()不用创建一个新的对象,可以减少内存开销;

2. 方法返回一个emptyList()时,不会报空指针异常,如果直接返回Null,没有进行非空判断就会报空指针异常;

注意:此List与常用的List不同,它是Collections类里的静态内部类,在继承AbstractList后并没有实现add()、remove()等方法,所以返回的List不能进行增加删除元素操作。

示例

 @Test
    public void test1() {
        String str = "";
        List<String> list = getList(str);
        System.out.println(list.size());
    }
    private static List<String> getList(String str) {
        if (StringUtils.isBlank(str)) {
            // 使用时不会报空指针
            return Collections.emptyList();
            // 使用null报空指针异常
//            return null; 
        }
        List<String> list = new ArrayList<String>();
        list.add(str);
        return list;
    }

增删操作

 @Test
    public void test2() {
        String str = "abc";
        List<String> list = Collections.emptyList();
        list.add(str);
        System.out.println(list.size());
    }

结果

在这里插入图片描述

如果需要对collections.emptyList()进行增删操作的话,就需要将collections.emptyList()转换成ArrayList()进行操作。

示例:

 @Test
    public void test2() {
        String str = "abc";
        List<String> list = Collections.emptyList();
        List<String> resultList = new ArrayList<>(list);
        resultList.add(str);
        System.out.println(resultList.size());
        System.out.println(resultList);
    }

结果:

在这里插入图片描述

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java使用定时器编写一个简单的抢红包小游戏

    Java使用定时器编写一个简单的抢红包小游戏

    这篇文章主要为大家介绍了Java如何使用定时器编写一个简单的抢红包小游戏,文中的示例代码讲解详细,感兴趣的小伙伴可以尝试一下
    2022-07-07
  • 使用JSON.toJSONString()返回{}的原因

    使用JSON.toJSONString()返回{}的原因

    这篇文章主要介绍了使用JSON.toJSONString()返回{}的原因,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • 安卓系统中实现摇一摇画面振动效果的方法

    安卓系统中实现摇一摇画面振动效果的方法

    这篇文章主要介绍了安卓系统中实现摇一摇画面振动效果的方法,调用Android SDK中的SensorEventListener接口,需要的朋友可以参考下
    2015-07-07
  • Java object wait notify notifyAll代码解析

    Java object wait notify notifyAll代码解析

    这篇文章主要介绍了Java object wait notify notifyAll代码解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • 理解Java注解及Spring的@Autowired是如何实现的

    理解Java注解及Spring的@Autowired是如何实现的

    今天通过本文带领大家学习注解的基础知识,学习Spring的@Autowired是怎么实现的,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2021-07-07
  • 使用maven实现redis与idea的连接问题

    使用maven实现redis与idea的连接问题

    这篇文章主要介绍了使用maven实现redis与idea的连接问题,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-07-07
  • SpringCloud Feign使用ApacheHttpClient代替默认client方式

    SpringCloud Feign使用ApacheHttpClient代替默认client方式

    这篇文章主要介绍了SpringCloud Feign使用ApacheHttpClient代替默认client方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • SpringBoot使用classfinal-maven-plugin插件加密Jar包的示例代码

    SpringBoot使用classfinal-maven-plugin插件加密Jar包的示例代码

    这篇文章给大家介绍了SpringBoot使用classfinal-maven-plugin插件加密Jar包的实例,文中通过代码示例和图文讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-02-02
  • Spring整合Junit的使用详解

    Spring整合Junit的使用详解

    这篇文章主要介绍了Spring整合Junit的使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • 解析Java的InputStream类并借助其读取ppt文件

    解析Java的InputStream类并借助其读取ppt文件

    这篇文章主要介绍了Java的InputStream类并借助其读取ppt文件,讲到了InputStream类中一些常用的方法的问题,需要的朋友可以参考下
    2015-11-11

最新评论