关于Java空字符串的判断

看到有同事直接用str==""判断字符串是否为空的,以前一直没用过,感到很新奇。回家上网查了一下,判断Java字符串是否为空有四种方法:
假定有字符串String str = "";
1. "".equals(str);//true
2. str.length()==0;//true
3. str.isEmpty();//true,jdk 6以后的新方法。
4. str == "";//true
如果进行一个几亿次的循环去测试这四种方法的运行效率的话,第一种是最慢的,后三种时间差不多,纳秒级比较的话,最后一种判断方法是最快的。
网上也说最后一种是最直观的,也是推荐的写法。
可是记得当初学习java的时候,在学习字符串这一块,任何资料都反复强调,在比较字符串是否相等的时候不能用==,要用equals()方法,难道对于空字符串是个例外?
简单的写了几个测试方法测试了一下:
1. 下面返回的是true,因为众所周知,字符串常量是保存在字符串常量池中的,而且相同字符串在常量池中只保存一份,所以下面的两个空字符串引用的地址是相同的,所以为true。
public class TestString
{
public static void main(String[] args){
String str = "";
System.out.println(str=="");//true
}
}

2.继续测试,下面的结果也为true,原因同上。
     String str = "abc";
System.out.println(str=="abc");//true

3.继续测试,下面的结果竟然仍为true。细究原因,应该是编译器在编译时就对代码进行了优化,这种写法得到的字节码文件应该与上面的相同。
     String str = "a" + "bc";
System.out.println(str=="abc");//true

4. 下面的结果为false,因为我们对字符串进行了运算,此时得到的变量str,虽然值也是"abc",但是却是指向堆内存地址的"abc",所以结果为false。
     String str = "a";
String str += "bc";
System.out.println(str=="abc");//false

一般不会出现类似的运算结果为空字符串的情况,貌似可以采用第四种方法直接用==去判断是否为空。但真的是这样的吗?
5.继续以上测试,一般我们得到的字符串都是函数返回值,如果一个函数返回空字符串是以return "";的形式返回,采用双等号判断自然是可行的。可是另一种常见的情况,我们在函数中对于多次修改的字符串是以StringBuffer进行操作的。最后用toString()返回字符串,此时:
        StringBuffer sb = new StringBuffer();
//... ...
//假如在一系列操作后,sb仍为空。
System.out.println(sb.toString().length() == 0);//true
System.out.println(sb.toString() == "")//false

因为StringBuffer类的字符串是指向堆内存的。
综上,所以我们在不明确调用的函数内部实现时,最好不要用==进行空字符串判断。
推荐第二种和第三种方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值