多平台统一管理软件接口,如何实现多平台统一管理软件接口
744
2022-09-15
java返回集合为null还是空集合及空集合的三种写法小结
目录返回集合为null还是空集合及空集合的三种写法返回空List的方式方式一:new ArrayList() 方式二:new ArrayList(0)方式三:Collections.emptyList()(推荐)
返回集合为null还是空集合及空集合的三种写法
个人认为在自己写接口时,需要返回集合时返回一个空集合,比如mybatis查询如果返回一个集合,结果为空时也会返回一个空集合而不是null。
那么这样有什么好处呢?最大的好处就是调用方不用在判断是否为null,可以直接用,因为不用抛空指针。
当然这也有缺点,如果返回Lists.newArrayList();或者new ArrayList();这会新建一个对象,而这个对象很可能是没必ZloQCxaAGZ要的,这样白白浪费性能。
解决方法当然也有,可以用Collections.emptyList();这个方法返回一个空集合,并不会新建对象,而是返回
public static final List EMPTY_LIST = new EmptyList<>();
这个变量。
当然这也有缺点,如果调用方只是遍历,这没什么不会报错,但是如果要新增,删除里面的元素那就会报错,
那么你可能想为什么,原因就是代码里直接写死了调用时报错,那么为什么要这样写呢?
原因也很简单,如果多个线程对这个集合增删,那么调用方就全乱了,所以采用了直接报错,快速失败的方法
来解决问题。
总结:
返回null,返回new ArrayList<>(),返回EMPTY_LIST 。
null肯定是不推荐的,那么是新建一个List还是返回空List呢?
这要根据接口的性能要求,如果性能要求高返回EMPTY_LIST,否则新建一个对象。
返回空List的方式
方式一:new ArrayList()
JDK1.8已经优化了,默认构造函数创建的list内部共享空数组,首次插入数据时才会扩容到默认容量;
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
方式二:new ArrayList(0)
private static final Object[] EMPTY_ELEMENTDATA = {};
public ArrayList(int initialCapacity) {
if (initialCapacity > 0) {
this.elementData = new Object[initialCapacity];
} else if (initialCapacity == 0) {
this.elementData = EMPTY_ELEMENTDATA;
} else {
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
}
}
方式三:Collections.emptyList()(推荐)
特点:不可变,安全
/**
* The empty list (immutable). This list is serializable.
*
* @see #emptyList()
*/
@SuppressWarnings("rawtypes")
public static final List EMPTY_LIST = new EmptyList<>();
/**
* http://Returns an empty list (immutable). This list is serializable.
*
*
This example illustrates the type-safe way to obtain an empty list:
*
* List
*
*
* @implNote
* 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.)
*
* @param
* @return an empty immutable list
*
* @see #EMPTY_LIST
* @since 1.5
*/
@SuppressWarnings("unchecked")
public static final
return (List
}
/**
* @serial include
*/
private static class EmptyList
extends AbstractList
implements RandomAccess, Serializable {
private static final long serialVersionUID = 8842843931221139166L;
public Iterator
return emptyIterator();
}
public 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
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; }
@Override
public boolean removeIf(Predicate super E> filter) {
Objects.requireNonNull(filter);
return false;
}
@Override
public void replaceAll(UnaryOperator
Objects.requireNonNull(operator);
}
@Override
public void sort(Comparator super E> c) {
}
// Override default methods in Collection
@Override
public void forEach(Consumer super E> action) {
Objects.requireNonNull(action);
}
@Override
public Spliterator
// Preserves singleton property
private Object readResolve() {
return EMPTY_LIST;
}
}
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~