java程序中比较常见的四种判断是不是为空的性能优化比较

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java程序中比较常见的四种判断是不是为空的性能优化比较相关的知识,希望对你有一定的参考价值。

来做个测试  


     

java用的最多的判空,殊不知,多数人一直在用一种最耗时,性能最差的方式

本测试用例特意比较常用的4种判空形式


/**
 * 字符串判空性能大比较
 */
public class Test

    String s = "";

    long   n = 10000000;

    //s == null || s.equals("")
    private void function1()
        long startTime = System.currentTimeMillis();
        for (long i = 0; i < n; i++)
            if (s == null || s.equals(""))
                ;
        
        long endTime = System.currentTimeMillis();
        System.out.println("[s == null || s.equals(\\"\\")] use time: " + (endTime - startTime) + "ms");
    

    //s == null || s.length() <= 0
    private void function2()
        long startTime = System.currentTimeMillis();
        for (long i = 0; i < n; i++)
            if (s == null || s.length() <= 0)
                ;
        
        long endTime = System.currentTimeMillis();
        System.out.println("[s == null || s.length() <= 0] use time: " + (endTime - startTime) + "ms");
    

    //s == null || s.isEmpty()
    private void function3()
        long startTime = System.currentTimeMillis();
        for (long i = 0; i < n; i++)
            if (s == null || s.isEmpty())//since jdk1.6
                ;
        
        long endTime = System.currentTimeMillis();
        System.out.println("[s == null || s.isEmpty()] use time: " + (endTime - startTime) + "ms");
    

    //s == null || s == ""
    private void function4()
        long startTime = System.currentTimeMillis();
        for (long i = 0; i < n; i++)
            if (s == null || s == "")
                ;
        
        long endTime = System.currentTimeMillis();
        System.out.println("[s == null || s == \\"\\"] use time: " + (endTime - startTime) + "ms");
    

    public static void main(String[] args)
        Test test = new Test();
        test.function1();
        test.function2();
        test.function3();
        test.function4();
    

 


直接右键运行,结果一目了然



[s == null || s.equals("")] use time: 73ms

[s == null || s.length() <= 0] use time: 29ms

[s == null || s.isEmpty()] use time: 33ms

[s == null || s == ""] use time: 29ms



参考技术A

以下是java 判断字符串是否为空的四种方法:

方法一: 最多人使用的一个方法, 直观, 方便, 但效率很低:

                                    if(s == null ||"".equals(s));

方法二: 比较字符串长度, 效率高, 是我知道的最好一个方法:

                      if(s == null || s.length() <= 0);

方法三: Java SE 6.0 才开始提供的方法, 效率和方法二几乎相等, 但出于兼容性考虑, 推荐使用方法二.

                     if(s == null || s.isEmpty());

方法四: 这是一种比较直观,简便的方法,而且效率也非常的高,与方法二、三的效率差不多:

                     if (s == null || s == "");

public class Zifuchuanpankong 
    public static final String  STR = "1111111";
    public static void function1()
        long startTime = System.currentTimeMillis();
        for (int i = 0; i < 10000000; i++) 
            if (STR == null || "".equals(STR)) 
                ;
            
        
        long endTime = System.currentTimeMillis();
        System.err.println("[STR == null || \\"\\".equals(STR)] 耗时:"+(endTime-startTime)+" ms");
    
    public static void function2()
        long startTime = System.currentTimeMillis();
        for (int i = 0; i < 10000000; i++) 
            if (STR == null || STR.length()<=0) 
                ;
            
        
        long endTime = System.currentTimeMillis();
        System.err.println("[STR == null || STR.length()<=0] 耗时:"+(endTime-startTime)+" ms");
    
    public static void function3()
        long startTime = System.currentTimeMillis();
        for (int i = 0; i < 10000000; i++) 
            if (STR == null || STR.isEmpty()) 
                ;
            
        
        long endTime = System.currentTimeMillis();
        System.err.println("[STR == null || STR.isEmpty()] 耗时:"+(endTime-startTime)+" ms");
    
    public static void function4()
        long startTime = System.currentTimeMillis();
        for (int i = 0; i < 10000000; i++) 
            if (STR == null || STR == "") 
                ;
            
        
        long endTime = System.currentTimeMillis();
        System.err.println("[STR == null || STR == \\"\\"] 耗时:"+(endTime-startTime)+" ms");
    

    public static void main(String[] args) 
        function1();
        function2();
        function3();
        function4();
    

[STR == null || "".equals(STR)] 耗时:51 ms
[STR == null || STR.length()<=0] 耗时:7 ms
[STR == null || STR.isEmpty()] 耗时:9 ms
[STR == null || STR == ""] 耗时:4 ms

为啥判断队列是不是为空时只需比较队首指示和队尾指示是不是相等即可?

java里直接一句话
return(front==rear);
如果队列里只有一个元素a,队首队尾正好是同一个元素,即元素a,用这句话怎么能判断队列为空呢?求大神指点。是不是队首队尾的概念理解有误?

参考技术A

队首指向第一个元素,队尾指向的是最后一个元素的 下一个位置,

如果队列里只有一个元素a,那么队首指向的是a,但队尾指向的是a的下一个位置。

参考技术B 不是,队列在front指向的是队列头部元素的下一个位置,所以并不是指向对列头部元素,它指的是一个空的位置。本回答被提问者和网友采纳

以上是关于java程序中比较常见的四种判断是不是为空的性能优化比较的主要内容,如果未能解决你的问题,请参考以下文章

java判断字符串是否为空的方法总结

java 怎样判断一个对象是不是为空?

为啥判断队列是不是为空时只需比较队首指示和队尾指示是不是相等即可?

Java取两个变量不为空的变量的简便方法!

java判断字符串是不是为空

Java中的四种引用类型比较