字符串判空的常见的判断方法!

前言:

这篇文章主要从==和equals的区别然后延伸到开发中字符串判断是否是空(null)或空字符串("")的讲解。

正文:

一、java中操作符"=="的作用:

①在基本数据类型中byte,short,int,long,float,double,boolean,char,"=="的比较是值。

public static void main(String[] args) {
    int i=1;
    int j=1;
    System.out.println(i==j);
}

运行结果:true

②在引用数据类型中,"=="比较的是在堆内存中的地址值。

public static void main(String[] args) {
    Man man1 = new Man();
    Man man2 = new Man();
    System.out.println(man1==man2);

}

运行结果:false

二、java中equals的作用

①在引用数据类型中比较的是堆内存中的地址值。

public static void main(String[] args) {
    Man man1 = new Man();
    Man man2 = new Man();
    System.out.println(man1.equals(man2));

}

运行结果:false

不过一般在使用equals比较时,都会对equals进行重写,这样它比较的就不是对象在堆内存中的地址值啦。

三、String类中的==和equals的作用,这里会有点不一样

①==还是进行地址比较

public static void main(String[] args) {
    String s1 = new String("dada");
    String s2 = new String("dada");
    System.out.println(s1==s2);//false
    String s3="dada";
    String s4="dada";
    System.out.println(s3==s4);//true
}

s1==s2还是false,这说明的确比较的是堆内存中的地址值,s3==s4是true他也是比的堆内存中的地址,只是字符串有个字符串池的概念,字符串池中"abc"只有一个abc,他们的地址一样,所以s3==s4的结果是true。

②由于字符串中的equals方法被重写啦,所以比较的是两个字符串的内容

public static void main(String[] args) {
    String s1 = new String("dada");
    String s2 = new String("dada");
    System.out.println(s1.equals(s2));
}

运行结果:true

四、如何判断字符串是否为空(null)或者是空字符串("")的方法

①在判断之前先要理解一个知识点:null和""的区别

null表示这个字符串没有任何指向,因为null没有分配空间,而""在堆中分配了空间。

②java判断字符串的四种方法

方法1:if(s==null || s.equals("")){逻辑...}  这种效率低

方法2:if(s==null || s.length()==0){逻辑...} 效率比方法一的效率高

方法3:if(s==null || s.isEmpty() ){逻辑...}效率和方法二差不多,但是Strng的isEmpty()方法是1.6以上才生效 

得到这样效率快慢结论的依据:

我们分别看下这三个方法的源码:

s.equals("")

public boolean equals(Object anObject) {
        if (this == anObject) {//比较地址
            return true;
        }
        if (anObject instanceof String) {//判断是否是字符串类型
            String anotherString = (String)anObject;
            int n = value.length;
            if (n == anotherString.value.length) {//比较长度
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])//每个字符都得相同
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

s.length()==0

 public int length() {
        return value.length;
    }

s.isEmpty()

public boolean isEmpty() {
        return value.length == 0;
    }

我们可以看出来,方法二和方法一比较的方法,都是比较长度是否==0,所以理论上效率应该基本一致,而方法一在比较字符串的时候则明显要比方法二和方法三复杂,所以方法一理论上效率要慢些。

方法4:通过StringUtils判断是否为空(优先推荐使用org.apache.commons.lang包下的StringUtils来判断,原因是:用StringUtils可以避免空指针问题

例如 String dada=null;

然后在下面进行if(dada.equals("")),如果dada没有初始化,则会报空指针的错误,提示dada不能为空,但是我们在用stringutils时可以避免这个问题。

①StringUtils.isEmpty判断某字符串是否为空,为空的标准是 str==null 或 str.length()==0

StringUtils.isEmpty(null) = true
StringUtils.isEmpty("") = true
StringUtils.isEmpty(" ") = false //注意在 StringUtils 中空格作非空处理

②StringUtils.isBlank判断某字符串是否为空,为空的标准是str==null 或 str.length()==0或由空白符(whitespace) 构成

StringUtils.isBlank(null) = true
StringUtils.isBlank("") = true
StringUtils.isBlank(" ") = true

-------------------------------------------------------------华丽的分割线------------------------------------------------------------------------------------------

错误的判断方法:

if(s==null || s=="" ){逻辑...} ----------------但这种方法是不太正确的,因为操作运算符==实质还是比较堆内存中的地址,只不过String dada="";的这样的方式创建字符串,dada=="";的结果就是true,但是如果以下面的方式创建就是false.。

public static void main(String[] args) {
   String s=new String("");
    System.out.println(s=="");
}
所以在判断字符串的内容是否等于""时用equals

参考文章:

https://www.cnblogs.com/yaya-yaya/p/6096539.html

https://blog.csdn.net/weixin_41404773/article/details/79558355

总结:

我是阿达,一名喜欢分享知识的程序员,时不时的也会荒腔走板的聊一聊电影、电视剧、音乐、漫画,这里已经有16位小伙伴在等你们啦,感兴趣的就赶紧来点击关注我把,哪里不明白或有不同观点的地方欢迎留言。

猜你喜欢

转载自blog.csdn.net/jdk_wangtaida/article/details/87946122