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

网友投稿 389 2022-09-14


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

目录emptyList()方法的使用java Collections.emptyList()方法的注意事项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.

*

*

This example illustrates the type-safe way to obtain an empty list:

*

* List<String> s = Collections.emptyList();

*

* Implementation note: Implementations of this method need not

* create a separate List 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 List emptyList() {

return (List) EMPTY_LIST;

}

/**

* @serial include

*/

private static class EmptyList extends AbstractList implements RandomAccess,Serializable {

// use serialVersionUID from JDK 1.2.2 for interoperability

private static final long serialVersionUID = 88428439312DOXrlE21139166L;

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 list = new ArrayList();

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)

DOXrlE 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 list = getList(str);

System.out.println(list.size());

}

private static List getList(String str) {

if (StringUtils.isBlank(str)) {

// 使用时不会报空指针

return Collections.emptyList();

// 使用null报空指针异常

// return null;

}

List list = new ArrayList();

list.add(str);

return list;

}

增删操作:

@Test

public void test2() {

String str = "abc";

List list = Collections.emptyList();

list.add(str);

System.out.println(list.size());

}

结果:

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

示例:

@Test

public void test2() {

String str = "abc";

List list = Collections.emptyList();

List resultList = neDOXrlEw ArrayList<>(list);

resultList.add(str);

System.out.println(resultList.size());

System.out.println(resultList);

}

结果:


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:网络管理IT产品采购(采购it系统)
下一篇:网络管理员应具备哪些素质,具体为哪方面的知识?(做网络管理员要具备什么)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~