Java之Collections.emptyList()、emptySet()、emptyMap()的作用和好处以及要注意的地方
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java之Collections.emptyList()、emptySet()、emptyMap()的作用和好处以及要注意的地方,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4196字,纯文字阅读大概需要6分钟。
内容图文
![Java之Collections.emptyList()、emptySet()、emptyMap()的作用和好处以及要注意的地方](/upload/InfoBanner/zyjiaocheng/851/745ca2cd2d994e999f9678dbabd2cb28.jpg)
https://blog.csdn.net/qq_27093465/article/details/65444622
先说明一下好处有哪些:
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报异常就对啦。
下面简单看下这个源码:
/**
* Collections 类里面的方法如下,一步步往下看就是啦
*/
public static final <T> List<T> emptyList() {
return (List<T>) EMPTY_LIST;
}
//。。。。。
/**
* Collections 类里面的方法如下,一步步往下看就是啦
*/
public static final List EMPTY_LIST = new EmptyList<>();
//。。。。。
/**
* Collections里面的一个静态内部类
*/
private static class EmptyList<E> extends AbstractList<E> implements RandomAccess, Serializable {
private static final long serialVersionUID = 8842843931221139166L;
public Iterator<E> iterator() {
return emptyIterator();
}
public ListIterator<E> listIterator() {
return emptyListIterator();
}
public int size() {return 0;}
public boolean isEmpty() {return true;}
public boolean contains(Object obj) {return false;}
public boolean containsAll(Collection<?> c) { return c.isEmpty(); }
public Object[] toArray() { return new Object[0]; }
public <T> T[] toArray(T[] a) {
if (a.length > 0)
a[0] = null;
return a;
}
public E get(int index) {
throw new IndexOutOfBoundsException("Index: "+index);
}
public boolean equals(Object o) {
return (o instanceof List) && ((List<?>)o).isEmpty();
}
public int hashCode() { return 1; }
// Preserves singleton property
private Object readResolve() {
return EMPTY_LIST;
}
}
除了这个emptyList,之外,还有类似的,emptyMap,emptySet等等。具体看下图,都是一个套路。
(2017/08/28 更新)
看下面的代码,咱先弄个empty出来,然后,可能有需求要继续在这个空集合里面添加内容。那么,bug就来啦。
/**
* 测试这个空集合是某个Java bean 的某个属性的时候的操作,也是不能add的
*/
private static void testModelEmptyField() {
Car car = new Car();
car.setBoys(Collections.emptyList());
car.getBoys().add("sss");
}
/**
* Collections.emptyMap() 返回的空集合是不能进行put的
*/
private static void testEmptyMap() {
Map<String,String> map = Collections.emptyMap();
for (Map.Entry<String, String> entry : map.entrySet()) {
System.out.println(entry.getKey() + ":"+ entry.getValue());
}
map.put("a","a");
for (Map.Entry<String, String> entry : map.entrySet()) {
System.out.println(entry.getKey() + ":"+ entry.getValue());
}
}
/**
* Collections.emptyList() 返回的空集合是不能进行add的
*/
private static void testEmptyList() {
List<String> list = Collections.emptyList();
for (String s : list) {
System.out.println(s);
}
//异常
list.add("1");
for (String s : list) {
System.out.println(s);
}
}
具体出的bug,看下面的截图。
阿弥陀佛,算了 ,这个咱还是不用了吧。
很危险的,分分钟代码就bug啦。这个不好,不好。。。不用啦,了解下就得啦。
---------------------
作者:李学凯
来源:CSDN
原文:https://blog.csdn.net/qq_27093465/article/details/65444622?utm_source=copy
版权声明:本文为博主原创文章,转载请附上博文链接!
内容总结
以上是互联网集市为您收集整理的Java之Collections.emptyList()、emptySet()、emptyMap()的作用和好处以及要注意的地方全部内容,希望文章能够帮你解决Java之Collections.emptyList()、emptySet()、emptyMap()的作用和好处以及要注意的地方所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。