欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java返回集合為null還是空集合及空集合的三種寫法小結(jié)

 更新時(shí)間:2021年11月12日 11:38:40   作者:月染霜華  
這篇文章主要介紹了java返回集合為null還是空集合及空集合的三種寫法小結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

返回集合為null還是空集合及空集合的三種寫法

個(gè)人認(rèn)為在自己寫接口時(shí),需要返回集合時(shí)返回一個(gè)空集合,比如mybatis查詢?nèi)绻祷匾粋€(gè)集合,結(jié)果為空時(shí)也會(huì)返回一個(gè)空集合而不是null。

那么這樣有什么好處呢?最大的好處就是調(diào)用方不用在判斷是否為null,可以直接用,因?yàn)椴挥脪伩罩羔槨?/p>

當(dāng)然這也有缺點(diǎn),如果返回Lists.newArrayList();或者new ArrayList();這會(huì)新建一個(gè)對(duì)象,而這個(gè)對(duì)象很可能是沒(méi)必要的,這樣白白浪費(fèi)性能。

解決方法當(dāng)然也有,可以用Collections.emptyList();這個(gè)方法返回一個(gè)空集合,并不會(huì)新建對(duì)象,而是返回

public static final List EMPTY_LIST = new EmptyList<>(); 

這個(gè)變量。

當(dāng)然這也有缺點(diǎn),如果調(diào)用方只是遍歷,這沒(méi)什么不會(huì)報(bào)錯(cuò),但是如果要新增,刪除里面的元素那就會(huì)報(bào)錯(cuò),

那么你可能想為什么,原因就是代碼里直接寫死了調(diào)用時(shí)報(bào)錯(cuò),那么為什么要這樣寫呢?

原因也很簡(jiǎn)單,如果多個(gè)線程對(duì)這個(gè)集合增刪,那么調(diào)用方就全亂了,所以采用了直接報(bào)錯(cuò),快速失敗的方法

來(lái)解決問(wèn)題。

總結(jié):

返回null,返回new ArrayList<>(),返回EMPTY_LIST 。

null肯定是不推薦的,那么是新建一個(gè)List還是返回空List呢?

這要根據(jù)接口的性能要求,如果性能要求高返回EMPTY_LIST,否則新建一個(gè)對(duì)象。

返回空List的方式

方式一:new ArrayList()  

JDK1.8已經(jīng)優(yōu)化了,默認(rèn)構(gòu)造函數(shù)創(chuàng)建的list內(nèi)部共享空數(shù)組,首次插入數(shù)據(jù)時(shí)才會(huì)擴(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;
}
}

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Spring集成Swagger常見(jiàn)錯(cuò)誤及解決辦法

    Spring集成Swagger常見(jiàn)錯(cuò)誤及解決辦法

    這篇文章主要介紹了Spring集成Swagger常見(jiàn)錯(cuò)誤及解決辦法,幫助大家更好的理解和學(xué)習(xí)使用Spring,感興趣的朋友可以了解下
    2021-05-05
  • java截取圖片示例

    java截取圖片示例

    這篇文章主要介紹了java截取圖片示例,把代碼中的圖片路徑改成自己的圖片,運(yùn)行就可以看到效果了,需要的朋友可以參考下
    2014-03-03
  • Java中documentHelper解析xml獲取想要的數(shù)據(jù)

    Java中documentHelper解析xml獲取想要的數(shù)據(jù)

    本文主要介紹了Java中documentHelper解析xml獲取想要的數(shù)據(jù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(16)

    Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(16)

    下面小編就為大家?guī)?lái)一篇Java基礎(chǔ)的幾道練習(xí)題(分享)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧,希望可以幫到你
    2021-07-07
  • mybatis如何使用Java8的日期LocalDate和LocalDateTime詳解

    mybatis如何使用Java8的日期LocalDate和LocalDateTime詳解

    這篇文章主要給大家介紹了關(guān)于mybatis如何使用Java8的日期LocalDate和LocalDateTime的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-09-09
  • Java實(shí)現(xiàn)創(chuàng)建Zip壓縮包并寫入文件

    Java實(shí)現(xiàn)創(chuàng)建Zip壓縮包并寫入文件

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)創(chuàng)建Zip壓縮包并寫入文件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Java拖曳鼠標(biāo)實(shí)現(xiàn)畫線功能的方法

    Java拖曳鼠標(biāo)實(shí)現(xiàn)畫線功能的方法

    這篇文章主要介紹了Java拖曳鼠標(biāo)實(shí)現(xiàn)畫線功能的方法,需要的朋友可以參考下
    2014-07-07
  • 下載遠(yuǎn)程maven倉(cāng)庫(kù)的jar?手動(dòng)放到本地倉(cāng)庫(kù)詳細(xì)操作

    下載遠(yuǎn)程maven倉(cāng)庫(kù)的jar?手動(dòng)放到本地倉(cāng)庫(kù)詳細(xì)操作

    這篇文章主要介紹了如何下載遠(yuǎn)程maven倉(cāng)庫(kù)的jar?手動(dòng)放到本地倉(cāng)庫(kù),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-03-03
  • SpringMVC和Ajax的交互詳解(手工處理)

    SpringMVC和Ajax的交互詳解(手工處理)

    Ajax即異步的?JavaScript和XML,是一種無(wú)需重新加載整個(gè)網(wǎng)頁(yè)的情況下,能夠更新部分模塊的網(wǎng)頁(yè)技術(shù),下面這篇文章主要給大家介紹了關(guān)于SpringMVC和Ajax交互的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08
  • spring*.xml配置文件明文加密的實(shí)現(xiàn)

    spring*.xml配置文件明文加密的實(shí)現(xiàn)

    這篇文章主要介紹了spring*.xml配置文件明文加密的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01

最新評(píng)論