java返回集合為null還是空集合及空集合的三種寫法小結(jié)
返回集合為null還是空集合及空集合的三種寫法
個人認(rèn)為在自己寫接口時,需要返回集合時返回一個空集合,比如mybatis查詢?nèi)绻祷匾粋€集合,結(jié)果為空時也會返回一個空集合而不是null。
那么這樣有什么好處呢?最大的好處就是調(diào)用方不用在判斷是否為null,可以直接用,因?yàn)椴挥脪伩罩羔槨?/p>
當(dāng)然這也有缺點(diǎn),如果返回Lists.newArrayList();或者new ArrayList();這會新建一個對象,而這個對象很可能是沒必要的,這樣白白浪費(fèi)性能。
解決方法當(dāng)然也有,可以用Collections.emptyList();這個方法返回一個空集合,并不會新建對象,而是返回
public static final List EMPTY_LIST = new EmptyList<>();
這個變量。
當(dāng)然這也有缺點(diǎn),如果調(diào)用方只是遍歷,這沒什么不會報(bào)錯,但是如果要新增,刪除里面的元素那就會報(bào)錯,
那么你可能想為什么,原因就是代碼里直接寫死了調(diào)用時報(bào)錯,那么為什么要這樣寫呢?
原因也很簡單,如果多個線程對這個集合增刪,那么調(diào)用方就全亂了,所以采用了直接報(bà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()(推薦)
特點(diǎn):不可變,安全
/** * 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)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java中documentHelper解析xml獲取想要的數(shù)據(jù)
本文主要介紹了Java中documentHelper解析xml獲取想要的數(shù)據(jù),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(16)
下面小編就為大家?guī)硪黄狫ava基礎(chǔ)的幾道練習(xí)題(分享)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧,希望可以幫到你2021-07-07mybatis如何使用Java8的日期LocalDate和LocalDateTime詳解
這篇文章主要給大家介紹了關(guān)于mybatis如何使用Java8的日期LocalDate和LocalDateTime的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-09-09Java實(shí)現(xiàn)創(chuàng)建Zip壓縮包并寫入文件
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)創(chuàng)建Zip壓縮包并寫入文件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-01-01Java拖曳鼠標(biāo)實(shí)現(xiàn)畫線功能的方法
這篇文章主要介紹了Java拖曳鼠標(biāo)實(shí)現(xiàn)畫線功能的方法,需要的朋友可以參考下2014-07-07下載遠(yuǎn)程maven倉庫的jar?手動放到本地倉庫詳細(xì)操作
這篇文章主要介紹了如何下載遠(yuǎn)程maven倉庫的jar?手動放到本地倉庫,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-03-03spring*.xml配置文件明文加密的實(shí)現(xiàn)
這篇文章主要介紹了spring*.xml配置文件明文加密的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01