首页 > 编程语言 >Java之size()>0 和isEmpt()性能考量

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

时间:2023-03-22 22:34:09浏览次数:40  
标签:Java isEmpt int isEmpty return null public size


为何要写这篇呢?主要是要纠正一个长期以来的误区: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
}

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

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的确是更好的选择。

 

 

标签:Java,isEmpt,int,isEmpty,return,null,public,size
From: https://blog.51cto.com/alex/6143471

相关文章

  • BDD之Java Testing with Spock
    为何会专门写这篇BDD呢?之前我发表过一篇《代码重构之TDD的思考》,有童靴联系到我,探讨之余,感觉这几年集成化方面的测试方案产出太少了,优秀的也太少了。今天带大家了解一个新东......
  • Java运算符
    Java运算符Java运算符有:算术运算符、关系运算符、位运算符、逻辑运算符、赋值运算符、其他运算符算术运算符A=10,B=20操作符描述例子+加法,运算符两侧的值相加......
  • 【Javaweb】html frame标签的使用 | 导航栏右侧内容的实现
    问题的产生:是我和同伴做了一个导航栏,但是我们不知道怎么实现右侧内容的切换    然后我们查了很多资料,但是有一些是垂直的,但是就如图可见,我们是水平的,那么怎么实......
  • Java入门_一维数组_第二题_随机生成数
    前提小白一个,啥都不会,欢迎指点。题目随机生成10个整数(1-100的范围),保存到数组,并倒序打印以及求平均值,求最大值和最大值的下标,并查找里面知否有8。思路随机生成--......
  • Java:数据表的字段设计了默认值0不生效的原因
    在数据表里给字段设置了默认值为0,但是在插入的时候不生效,数据表设计如下 通过数据表生成的实体类查看代码@Data@TableName(value="user")@NoArgsConstructor@A......
  • Java单例
    /***@Author:DengJia*@Date:2023/3/22*@Description:单例*/publicclassSingleton{publicstaticvoidmain(String[]args){System.out......
  • Java学习笔记(八)GUI
    GUI编程如何学习?这是什么?它怎么玩?该如何去平时运用?组件窗口弹窗面板文本框列表框按钮图片监听事件鼠标键盘破解工具1.简介Gui的核心技术:SwingAWT,......
  • Java 执行命令 Apache Common-Exec
    command="cmd.exe/c"+command;ByteArrayOutputStreamstdout=newByteArrayOutputStream();PumpStreamHandlerpsh=newPumpStreamHandler(stdout);CommandLinecl......
  • Java 全文搜索框架 Lucene
    Lucene是apache软件基金会一个开放源代码的全文检索引擎工具包,是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎。Lucene的目的是为软件开发人员......
  • JavaScript 通讯框架 NowJS
    NowJS是一个实现了JavaScript服务器端进行通讯的框架,基于​​Node.js​​开发。示例代码:服务器端:<scriptsrc="/nowjs/now.js"></script>vareveryone=require("now"......