我是靠谱客的博主 还单身缘分,这篇文章主要介绍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()方法同理。

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
/** * 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()方法的测试

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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不能进行增加删除元素操作。

示例

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@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; }

增删操作

复制代码
1
2
3
4
5
6
7
@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()进行操作。

示例:

复制代码
1
2
3
4
5
6
7
8
9
@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.util.Collections类—emptyList()方法的使用的全部内容,更多相关java.util.Collections类—emptyList()方法内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(117)

评论列表共有 0 条评论

立即
投稿
返回
顶部