java返回集合為null還是空集合及空集合的三種寫法小結(jié)
返回集合為null還是空集合及空集合的三種寫法
個人認(rèn)為在自己寫接口時,需要返回集合時返回一個空集合,比如mybatis查詢?nèi)绻祷匾粋€集合,結(jié)果為空時也會返回一個空集合而不是null。
那么這樣有什么好處呢?最大的好處就是調(diào)用方不用在判斷是否為null,可以直接用,因為不用拋空指針。
當(dāng)然這也有缺點,如果返回Lists.newArrayList();或者new ArrayList();這會新建一個對象,而這個對象很可能是沒必要的,這樣白白浪費(fèi)性能。
解決方法當(dāng)然也有,可以用Collections.emptyList();這個方法返回一個空集合,并不會新建對象,而是返回
public static final List EMPTY_LIST = new EmptyList<>();
這個變量。
當(dāng)然這也有缺點,如果調(diào)用方只是遍歷,這沒什么不會報錯,但是如果要新增,刪除里面的元素那就會報錯,
那么你可能想為什么,原因就是代碼里直接寫死了調(diào)用時報錯,那么為什么要這樣寫呢?
原因也很簡單,如果多個線程對這個集合增刪,那么調(diào)用方就全亂了,所以采用了直接報錯,快速失敗的方法
來解決問題。
總結(jié):
返回null,返回new ArrayList<>(),返回EMPTY_LIST 。
null肯定是不推薦的,那么是新建一個List還是返回空List呢?
這要根據(jù)接口的性能要求,如果性能要求高返回EMPTY_LIST,否則新建一個對象。
返回空List的方式
方式一:new ArrayList()
JDK1.8已經(jīng)優(yōu)化了,默認(rèn)構(gòu)造函數(shù)創(chuàng)建的list內(nèi)部共享空數(shù)組,首次插入數(shù)據(jù)時才會擴(kuò)容到默認(rèn)容量;
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<>();
/**
* Returns an empty list (immutable). This list is serializable.
*
* <p>This example illustrates the type-safe way to obtain an empty list:
* <pre>
* List<String> s = Collections.emptyList();
* </pre>
*
* @implNote
* 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.)
*
* @param <T> type of elements, if there were any, in the list
* @return an empty immutable list
*
* @see #EMPTY_LIST
* @since 1.5
*/
@SuppressWarnings("unchecked")
public static final <T> List<T> emptyList() {
return (List<T>) EMPTY_LIST;
}
/**
* @serial include
*/
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; }
@Override
public boolean removeIf(Predicate<? super E> filter) {
Objects.requireNonNull(filter);
return false;
}
@Override
public void replaceAll(UnaryOperator<E> operator) {
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<E> spliterator() { return Spliterators.emptySpliterator(); }
// Preserves singleton property
private Object readResolve() {
return EMPTY_LIST;
}
}
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java8實現(xiàn)優(yōu)雅的獲取重復(fù)字符與次數(shù)
這篇文章主要為大家詳細(xì)介紹了在Java8中,我們應(yīng)該如何進(jìn)行字符及字符串的去重,以及計算去重次數(shù),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下2023-12-12
SpringBoot中數(shù)據(jù)傳輸對象(DTO)的實現(xiàn)
本文主要介紹了SpringBoot中數(shù)據(jù)傳輸對象(DTO)的實現(xiàn),包括了手動創(chuàng)建DTO、使用ModelMapper和Lombok創(chuàng)建DTO的示例,具有一定的參考價值,感興趣的可以了解一下2024-07-07
解決springboot整合cxf-jaxrs中json轉(zhuǎn)換的問題
這篇文章主要介紹了解決springboot整合cxf-jaxrs中json轉(zhuǎn)換的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07
java輸入時如何通過回車(enter)來結(jié)束輸入
這篇文章主要介紹了java輸入時如何通過回車(enter)來結(jié)束輸入,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-05-05
多模塊maven的deploy集成gitlab?ci自動發(fā)版配置
這篇文章主要為大家介紹了多模塊maven項目deploy集成gitlab?ci自動發(fā)版的配置流程步驟,有需要的朋友可以借鑒參考下,希望能夠有所幫助2022-02-02
JDK動態(tài)代理與CGLib動態(tài)代理的區(qū)別對比
今天小編就為大家分享一篇關(guān)于JDK動態(tài)代理與CGLib動態(tài)代理的區(qū)別對比,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-02-02

