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. public Iterator<E> iterator() {
  19. return emptyIterator();
  20. }
  21. public ListIterator<E> listIterator() {
  22. return emptyListIterator();
  23. }
  24. public int size() {return 0;}
  25. public boolean isEmpty() {return true;}
  26. public boolean contains(Object obj) {return false;}
  27. public boolean containsAll(Collection<?> c) { return c.isEmpty(); }
  28. public Object[] toArray() { return new Object[0]; }
  29. public <T> T[] toArray(T[] a) {
  30. if (a.length > 0)
  31. a[0] = null;
  32. return a;
  33. }
  34. public E get(int index) {
  35. throw new IndexOutOfBoundsException("Index: "+index);
  36. }
  37. public boolean equals(Object o) {
  38. return (o instanceof List) && ((List<?>)o).isEmpty();
  39. }
  40. public int hashCode() { return 1; }
  41. // Preserves singleton property
  42. private Object readResolve() {
  43. return EMPTY_LIST;
  44. }
  45. }

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

时间: 2024-08-12 02:21:27

Java之Collections.emptyList()、emptySet()、emptyMap()的作用和好处以及要注意的地方的相关文章

要点Java20 java.util.Collections

java.util.Collections 集合帮助类 演示样例程序(JUnit演示) 排序 @Test public void testSort() { List<Integer> demoList = new ArrayList<Integer>(Arrays.asList(3, 2, 1)); assertEquals(3, demoList.get(0).intValue()); //public static <T extends Comparable<? s

【JAVA学习】struts2 中 Actionsupport 的作用

尊重原创:http://xumiao900.iteye.com/blog/469760 Action 跟 Actionsupport 的区别 当我们在写action的时候,可以实现Action接口,也可以继承Actionsupport这个类.到底这两个有什么区别呢? Action接口有: public static final java.lang.String SUCCESS = "success"; public static final java.lang.String NONE

java中Collections.sort排序详解

Comparator是个接口,可重写compare()及equals()这两个方法,用于比价功能:如果是null的话,就是使用元素的默认顺序,如a,b,c,d,e,f,g,就是a,b,c,d,e,f,g这样,当然数字也是这样的.compare(a,b)方法:根据第一个参数小于.等于或大于第二个参数分别返回负整数.零或正整数.equals(obj)方法:仅当指定的对象也是一个 Comparator,并且强行实施与此 Comparator 相同的排序时才返回 true. Collections.so

java 18-11 Collections用于ArrayList集合中

Collections可以针对ArrayList存储基本包装类的元素排序,存储自定义对象可不可以排序呢? 自定义对象要自己写比较器进行排序 1 package cn.itcast_02; 2 3 import java.util.ArrayList; 4 import java.util.Collections; 5 import java.util.Comparator; 6 import java.util.List; 7 public class CollectionsDemo { 8 p

Java中Collections类的排序sort函数两种用法 (转http://viver120.blog.163.com/blog/static/60072482013010111228695/)

java中的Colletions类主要实现列表List的排序功能.根据函数参数的传递,具体的排序可以分为 : 1.  自然排序(natural ordering). 函数原型:sort(List<T> list)说明:参数是要参与排序列表的List对象                                                               实例说明:参与排序的列表的元素Student必须实现Comparable接口的public int compareTo(

[转]java中Collections.sort排序详解

Comparator是个接口,可重写compare()及equals()这两个方法,用于比价功能:如果是null的话,就是使用元素的默认顺序,如a,b,c,d,e,f,g,就是a,b,c,d,e,f,g这样,当然数字也是这样的. compare(a,b)方法:根据第一个参数小于.等于或大于第二个参数分别返回负整数.零或正整数. equals(obj)方法:仅当指定的对象也是一个 Comparator,并且强行实施与此 Comparator 相同的排序时才返回 true. Collections.

java的collections的sort的API

这里是有关JAVA的collections的sort 的有关知识 一: import java.util.ArrayList; import java.util.Collections; import java.util.List; public class SortListDSemo2 { public static void main(String[] args) { List<Point> list=new ArrayList<Point>(); list.add(new P

java.util.Collections.synchronizedSet()方法的使用

下面的例子显示java.util.Collections.synchronizedSet()方法的使用 package com.; import java.util.*; public class CollectionsDemo { public static void main(String[] args) { // create set Set<String> set = new HashSet<String>(); // populate the set set.add(&q

Java中Collections.sort()排序详解

第一种:Comparable 排序接口 若一个类实现了Comparable接口,就意味着"该类支持排序". 假设"有一个List列表(或数组),里面的元素是实现了Comparable接口的类",则该List列表(或数组)可以通过 Collections.sort(或 Arrays.sort)进行排序. 此外,"实现Comparable接口的类的对象"可以用作"有序映射(如TreeMap)"中的键或"有序集合(Tree