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

目录
  • Collection中的size()和isEmpty()区别说明
    • Collection集合类介绍与实验
  • list.size()和list.isEmpty()区别和效率及CollectionUtils.isEmpty()使用
    • 在实际的开发中经常要操作list
    • 查看ArrayList源码如下

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

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

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

Collection集合类介绍与实验

测试的集合类

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

Map

HashMap源码:

//每次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源码:

//每次添加新的元素的逻辑
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而已:

//内部声明的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

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

if(list!=null && list.size>0){
//进行集合的操作
}
  • 方法一(数据量大,效率低): if(list!=null && list.size()>0){}
  • 方法二(数据量大,效率高): if(list!=null && !list.isEmpty()){}

查看ArrayList源码如下

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

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

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

比如spring框架

包路径如下:

package org.springframework.util.CollectionUtils;

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

if(CollectionUtils.isEmpty()){
//对集合的操作
}

再比如Apache提供的CollectionUtils工具类

maven坐标:

<dependency>
            <groupId>commons-collections</groupId>
            <artifactId>commons-collections</artifactId>
            <version>3.2.2</version>
</dependency>

包路径:

package org.apache.commons.collections;

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

if(CollectionUtils.isEmpty()){
//对集合的操作
}

或者

if(CollectionUtils.isNotEmpty()){
//对集合的操作
}

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

(0)

相关推荐

  • StringUtils,CollectionUtils判断为空的方法和原生代码哪个效率最高

    目录 StringUtils,CollectionUtils判断为空的方法和原生代码哪个效率高 结论 isBlank与isEmpty区别 CollectionUtils封装类,判断为空的方法 StringUtils.CollectionUtils工具类的常用方法 一.CollectionUtils工具类 1.工作案例 二.StringUtils工具类 2.工作案例 StringUtils,CollectionUtils判断为空的方法和原生代码哪个效率高 之前一直疑惑,封装类的方法和直接写代码(字

  • Java中Collections.emptyList()的注意事项

    偶然发现有小伙伴错误地使用了Collections.emptyList()方法,这里记录一下.她的使用方式是: public void run() { ...... List list = buildList(param); ...... Object newNode = getNode(...); list.add(newNode); ...... } public List buildList(Object param) { if (isInValid(param)) { return Co

  • java-collection中的null,isEmpty用法

    目录 collection中的null,isEmpty用法 第一种情况 第二种情况 第三种情况 CollectionUtils.isEmpty和==null的区别 本文所指的CollectionUtils所属包 举个例子 collection中的null,isEmpty用法 只使用java utils包的isEmpty. 第一种情况 实例化list,但是size为空.     List<String> list =new ArrayList<>();         if (lis

  • java使用CollectionUtils工具类判断集合是否为空方式

    目录 使用CollectionUtils工具类判断集合是否为空 判断集合为空(List为null或size()==0) 判断集合不为空(List不为null且size()!=0) 判断集合是否为空底层 集合判断是否为空工具类(CollectionUtils) 工具类 方法 使用CollectionUtils工具类判断集合是否为空 判断集合为空(List为null或size()==0) 1.CollectionUtils.isEmpty(null): true 2.例:List<String>

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

    目录 Collection中的size()和isEmpty()区别说明 Collection集合类介绍与实验 list.size()和list.isEmpty()区别和效率及CollectionUtils.isEmpty()使用 在实际的开发中经常要操作list 查看ArrayList源码如下 Collection中的size()和isEmpty()区别说明 最近才发现很多网上的“纲领性”的指导完完全全不能相信,比如有的人说isEmpty()判空性能更好,也有的人拿出源码说这两个没区别. Col

  • java中ArrayList 、LinkList的区别分析

    1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构.      2.对于随机访问get和set,ArrayList优于LinkedList,因为ArrayList可以随机定位,而LinkedList要移动指针一步一步的移动到节点处.(参考数组与链表来思考)     3.对于新增和删除操作add和remove,LinedList比较占优势,只需要对指针进行修改即可,而ArrayList要移动数据来填补被删除的对象的空间. ArrayList和LinkedL

  • Java中HashSet和HashMap的区别_动力节点Java学院整理

    什么是HashSet? HashSet实现了Set接口,它不允许集合中有重复的值,当我们提到HashSet时,第一件事情就是在将对象存储在HashSet之前,要先确保对象重写equals()和hashCode()方法,这样才能比较对象的值是否相等,以确保set中没有储存相等的对象.如果我们没有重写这两个方法,将会使用这个方法的默认实现.. public boolean add(Object o)方法用来在Set中添加元素,当元素值重复时则会立即返回false,如果成功添加的话会返回true. 什

  • jQuery中serializeArray()与serialize()的区别实例分析

    本文实例讲述了jQuery中serializeArray()与serialize()的区别.分享给大家供大家参考,具体如下: serialize()序列化表单元素为字符串,用于 Ajax 请求. serializeArray()序列化表单元素为JSON数据. 具体实例如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xht

  • C#中struct和class的区别详解

    本文详细分析了C#中struct和class的区别,对于C#初学者来说是有必要加以了解并掌握的. 简单来说,struct是值类型,创建一个struct类型的实例被分配在栈上.class是引用类型,创建一个class类型实例被分配在托管堆上.但struct和class的区别远不止这么简单. 概括来讲,struct和class的不同体现在: ● 类是引用类型,struct是值类型 ● 在托管堆上创建类的实例,在栈上创建struct实例 ● 类实例的赋值,赋的是引用地址,struct实例的赋值,赋的是

  • 浅谈keras保存模型中的save()和save_weights()区别

    今天做了一个关于keras保存模型的实验,希望有助于大家了解keras保存模型的区别. 我们知道keras的模型一般保存为后缀名为h5的文件,比如final_model.h5.同样是h5文件用save()和save_weight()保存效果是不一样的. 我们用宇宙最通用的数据集MNIST来做这个实验,首先设计一个两层全连接网络: inputs = Input(shape=(784, )) x = Dense(64, activation='relu')(inputs) x = Dense(64,

  • 基于Keras中Conv1D和Conv2D的区别说明

    如有错误,欢迎斧正. 我的答案是,在Conv2D输入通道为1的情况下,二者是没有区别或者说是可以相互转化的.首先,二者调用的最后的代码都是后端代码(以TensorFlow为例,在tensorflow_backend.py里面可以找到): x = tf.nn.convolution( input=x, filter=kernel, dilation_rate=(dilation_rate,), strides=(strides,), padding=padding, data_format=tf_

  • MyBatis中resultMap和resultType的区别详解

    总结 基本映射 :(resultType)使用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功.(数据库,实体,查询字段,这些全部都得一一对应)高级映射 :(resultMap) 如果查询出来的列名和pojo的属性名不一致,通过定义一个resultMap对列名和pojo属性名之间作一个映射关系.(高级映射,字段名称可以不一致,通过映射来实现 resultType和resultMap功能类似 ,都是返回对象信息 ,但是resultMap要更强大一些

  • 对Mapper 中几种update的区别说明

    这两个update都是使用generator生成的mapper.xml文件中,对dao层的更新操作 update 更新传回数据的所有字段,没有传回的字段保持原样. updateByPrimaryKey 对实体类的字段全部更新(不判断是否为Null),即如果字段为空就更新为空: updateByPrimaryKeySelective 会对实体类字段进行判断再更新(如果为Null就忽略更新),如果字段为空,忽略不更新: 补充知识:mapper中insert.update.delete.select.

  • java中ArrayList和LinkedList的区别详解

    ArrayList和LinkedList都实现了List接口,有以下的不同点: 1.ArrayList是基于索引的数据接口,它的底层是数组.它可以以O(1)时间复杂度对元素进行随机访问.与此对应,LinkedList是以元素列表的形式存储它的数据,每一个元素都和它的前一个和后一个元素链接在一起,在这种情况下,查找某个元素的时间复杂度是O(n). 2.相对于ArrayList,LinkedList的插入,添加,删除操作速度更快,因为当元素被添加到集合任意位置的时候,不需要像数组那样重新计算大小或者

随机推荐