Java中关于size()>0 和isEmpt()的性能考量

目录
  • size()>0和isEmpt()性能考量
    • 以下内容是社区里的结论
  • list.size()>0&&list!=null和list!=null&&list.size()>0区别
    • 使用场合
    • 区别

size()>0 和isEmpt()性能考量

为何要写这篇呢?主要是要纠正一个长期以来的误区:size()>0 一定比isEmpt()性能差。

以下内容是社区里的结论

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

sonar的规范是这样描述:

Collection.isEmpty() should be used to test for emptiness

Using Collection.size() to test for emptiness works, but using Collection.isEmpty() makes the code more readable and can be more performant. The time complexity of any isEmpty() method implementation should be O(1) whereas some implementations of size() can be O(n).

明白了吧!

主要是语义更明确,其实判断List、Map、Set是否为空及效率比较真的没有多大的必要,确实是没有大多的提升。看源码:

ArrayList:

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

HashSet:

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

ConcurrentHashMap:

public int size() {
    long n = sumCount();
    return ((n < 0L) ? 0 :
            (n > (long)Integer.MAX_VALUE) ? Integer.MAX_VALUE :
            (int)n);
}
public boolean isEmpty() {
    return sumCount() <= 0L; // ignore transient negative values
}

其次,有些时候确实它更快,如果你使用了ConcurrentLinkedQueue、NavigableMap、NavigableSet,看源码:

ConcurrentSkipListMap

public int size() {
    long count = 0;
    for (Node<K,V> n = findFirst(); n != null; n = n.next) {
        if (n.getValidValue() != null)
            ++count;
    }
    return (count >= Integer.MAX_VALUE) ? Integer.MAX_VALUE : (int) count;
}
public boolean isEmpty() {
    return findFirst() == null;
}

最后,计算机是门需要刨根问底(点进源码看看)的技术活,不能人云亦云。综上所述,isEmpt的确是更好的选择。

list.size() > 0 && list != null 和 list != null && list.size()>0区别

使用场合

  • list==null; 此时list还没有实例化(new);
  • list.size()==0; 此时表明list已经实例化了,但list集合里面没有元素,长度为0

区别

如果list集合还未实例化,可用list != null && list.size() > 0进行判断,

如果用list.size() > 0 && list != null 进行判断的话,会报异常,因为list.size()用 在已经实例化的情况下,但现在未实例化,所以出错;

如果list集合已经实例化,则list != null && list.size() > 0 和 list.size() > 0 && list != null 两者都可以进行判断。

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

(0)

相关推荐

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

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

  • 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>

  • 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

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

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

  • Java中关于size()>0 和isEmpt()的性能考量

    目录 size()>0和isEmpt()性能考量 以下内容是社区里的结论 list.size()>0&&list!=null和list!=null&&list.size()>0区别 使用场合 区别 size()>0 和isEmpt()性能考量 为何要写这篇呢?主要是要纠正一个长期以来的误区:size()>0 一定比isEmpt()性能差. 以下内容是社区里的结论 方法一(数据量大,效率低):if(list!=null && li

  • java中BigDecimal和0比较的示例代码

    BigDecimal 和 0 比较大小 调用BigDecimal中的compareTo方法, 如: int i = bigDecimal.compareTo(BigDecimal.Zero); i=0:表示bigDecimal的值  等于 0 i=1:表示bigDecimal的值与 大于0 i=-1:表示bigDecimal的值与 小于 0 参考案例 BigDecimal num= new BigDecimal("18"); int i=num.compareTo(BigDecimal

  • Java中BigDecimal与0比较的一个坑实战记录

    目录 前言 问题解决 问题讲解 附:Java BigDecimal中一些其他的坑 总结 前言 在之前做的一个项目中,为了保证BigDecimal在除数 divide时,如果被除数为0,出现java.lang.ArithmeticException: / by zero 报错问题,写了一个对比.具体代码如下: public static BigDecimal getScale(BigDecimal data1,BigDecimal data2,Integer scale){ if(Objects.

  • Java中ArrayList和LinkedList的遍历与性能分析

    前言 通过本文你可以了解List的五种遍历方式及各自性能和foreach及Iterator的实现,加深对ArrayList和LinkedList实现的了解.下面来一起看看吧. 一.List的五种遍历方式 1.for each循环 List<Integer> list = new ArrayList<Integer>(); for (Integer j : list) { // use j } 2.显示调用集合迭代器 List<Integer> list = new Ar

  • 剖析Java中HashMap数据结构的源码及其性能优化

    存储结构 首先,HashMap是基于哈希表存储的.它内部有一个数组,当元素要存储的时候,先计算其key的哈希值,根据哈希值找到元素在数组中对应的下标.如果这个位置没有元素,就直接把当前元素放进去,如果有元素了(这里记为A),就把当前元素链接到元素A的前面,然后把当前元素放入数组中.所以在Hashmap中,数组其实保存的是链表的首节点.下面是百度百科的一张图: 如上图,每个元素是一个Entry对象,在其中保存了元素的key和value,还有一个指针可用于指向下一个对象.所有哈希值相同的key(也就

  • 浅谈java中BigDecimal类的简单用法

    一.BigDecimal概述 ​ Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算.双精度浮点型变量double可以处理16位有效数,但在实际应用中,可能需要对更大或者更小的数进行运算和处理.一般情况下,对于那些不需要准确计算精度的数字,我们可以直接使用Float和Double处理,但是Double.valueOf(String) 和Float.valueOf(String)会丢失精度.所以开发中,如果我们需要精确计算的结果,则必须使用

  • 详解Java中的BigDecimal

    今天碰到一个问题,金额计算用double类型会丢失经度,就改用了BigDecimal类型,这个类型之前用的比较少,没怎么接触.就到网上看了一下相关教程,写个总结记一下. BigDecimal类 对于不需要任何准确计算精度的数字可以直接使用float或double,但是如果需要精确计算的结果,则必须使用BigDecimal类,而且使用BigDecimal类也可以进行大数的操作. BigDecimal构造方法 1.public BigDecimal(double val) 将double表示形式转换

  • java中BigDecimal用法详解

    首先,学习一个东西,我们都必须要带着问题去学,这边我分为 [为什么?][是什么?][怎么用?] [为什么要用BigDecimal?] 首先,我们先看一下,下面这个现象 那为什么会出现这种情况呢? 因为不论是float 还是double都是浮点数,而计算机是二进制的,浮点数会失去一定的精确度. 注:根本原因是:十进制值通常没有完全相同的二进制表示形式;十进制数的二进制表示形式可能不精确.只能无限接近于那个值 但是,在项目中,我们不可能让这种情况出现,特别是金融项目,因为涉及金额的计算都必须十分精确

  • Mysql启动中 InnoDB: Error: log file ./ib_logfile0 is of different size 0 5242880 bytes 的问题

    如果你的配置文件使用了类似my-innodb-heavy-4G.cnf作为配置文件的话. Mysql可以正常启动,但innodb的表无法使用 在错误日志里你会看到如下输出: InnoDB: Error: log file ./ib_logfile0 is of different size 0 5242880 bytes 现在需要做的事情就是把原来的 innodb 的ib_logfile×备份到一个目录下,然后删除掉原来的文件,重启 mysql. 你会看到ib_logfile*大小变成了你配置文

  • Java中length,length(),size()详解及区别

    Java中length,length(),size()区别 length属性:用于获取数组长度. eg: int ar[] = new int{1,2,3} /** * 数组用length属性取得长度 */ int lenAr = ar.length;//此处lenAr=3 System.out.println("Arr length:"+lenAr); length()方法:用于获取字符串长度. String str = "Hello World Java"; /

随机推荐