好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Collection中的size()和isEmpty()区别说明

Collection中的size()和isEmpty()区别说明

最近才发现很多网上的[纲领性]的指导完完全全不能相信,比如有的人说isEmpty()判空性能更好,也有的人拿出源码说这两个没区别。

Collection集合中有十几种最终实现的类,比如HashMap、ArrayList、TreeSet之类的,如何判空这些集合类是最优雅,性能最好的呢?真的好想知道,既然网上没有那只好自己做测试了。

Collection集合类介绍与实验

测试的集合类

类型 实现类
Map HashMap、TreeMap、LinkedHashMap
List ArrayList
Set HashSet、TreeSet、LinkedHashSet

Map

HashMap源码:

?

1

2

3

4

5

6

7

8

9

10

11

12

//每次put元素

final V putVal( int hash, K key, V value, boolean onlyIfAbsent, boolean evict) {

    //省略N行代码...

    ++modCount;

    if (++size > threshold) resize();

    afterNodeInsertion(evict);

    return null ;

}

//HashMap的size()函数,复杂度为O(1)

public int size() { return size; }

//HashMap的isEmpty()函数,复杂度同为O(1)

public boolean isEmpty() { return size == 0 ; }

根据上述源码可以看到,HashMap在每次put元素时便维护了size字段,size()==0和isEmpty没任何性能上的区别。

List

ArrayList源码:

?

1

2

3

4

5

6

7

8

9

10

//每次添加新的元素的逻辑

public boolean add(E e) {

    ensureCapacityInternal(size + 1 );  

    elementData[size++] = e;

    return true ;

}

//ArrayList的size()函数,复杂度为O(1)

public int size() { return size; }

//ArrayList的isEmpty()函数,复杂度同为O(1)

public boolean isEmpty() { return size == 0 ; }

可以看到,用size()==0和isEmpty()性能上没任何区别。

Set

HashSet相对比较简单,其内部维护了一个HashMap而已:

?

1

2

3

4

//内部声明的HashMap与其他函数

private transient HashMap<E,Object> map;

public int size() { return map.size(); }

public boolean isEmpty() { return map.isEmpty(); }

HashSet的size()==0和isEmpty()也没有任何性能区别。

list.size()和list.isEmpty()区别和效率及CollectionUtils.isEmpty()使用

在实际的开发中经常要操作list

而为了避免空指针异常,我们经常需要进行判空操作。一般的写法是:

?

1

2

3

if (list!= null && list.size> 0 ){

//进行集合的操作

方法一(数据量大,效率低): if(list!=null && list.size()>0){} 方法二(数据量大,效率高): if(list!=null && !list.isEmpty()){}

查看ArrayList源码如下

不明白为什么说有效率差距(就先姑且这么记吧,无奈)。

?

1

2

3

4

5

6

    public int size() {

        return size;

    }

    public boolean isEmpty() {

        return size == 0 ;

    }

大部分框架都会提供CollectionUtils这样的工具类

比如spring框架

包路径如下:

?

1

package org.springframework.util.CollectionUtils;

使用工具类以后的集合判空操作就简洁了不少:

?

1

2

3

if (CollectionUtils.isEmpty()){

//对集合的操作

}

再比如Apache提供的CollectionUtils工具类

maven坐标:

?

1

2

3

4

5

< dependency >

            < groupId >commons-collections</ groupId >

            < artifactId >commons-collections</ artifactId >

            < version >3.2.2</ version >

</ dependency >

包路径:

?

1

package org.apache测试数据mons.collections;

使用工具类以后的集合判空操作就简洁了不少:

?

1

2

3

if (CollectionUtils.isEmpty()){

//对集合的操作

}

或者

?

1

2

3

if (CollectionUtils.isNotEmpty()){

//对集合的操作

}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。

原文链接:https://blog.csdn.net/BlackButton_CC/article/details/103297555

查看更多关于Collection中的size()和isEmpty()区别说明的详细内容...

  阅读:21次