今天写个DEMO的时候碰到了个小麻烦,有关于题目所说的字符串这三者的区别,我觉得我真的是够了,居然会用得这么细,不过会了也好,碰到相关的问题就可以一言不合代码就开写!
既然研究,那就从结果说起,来看测试代码和输出结果:
// 测试代码package cn.com.dnyy.sn;publicclassCheckStringNull{publicstaticvoidmain(String[] args){newCheckStringNull().start();}// 执行方法publicvoidstart(){ String blackString="";// 空字符串 String isEmptyString=newString();// isEmpty String nullString= null;// 空 System.out.println("blackString:"+ blackString); System.out.println("isEmptyString:"+ isEmptyString); System.out.println("nullString:"+ nullString); System.out.println("------------------------------------"); System.out.println("blackString.getBytes().length:"+ blackString.getBytes().length); System.out.println("isEmptyString.getBytes().length:"+ isEmptyString.getBytes().length);//System.out.println("nullString.getBytes().length:" + nullString.getBytes().length); System.out.println("-----------------------------------------------------"); System.out.println("blackString.isEmpty:"+ blackString.isEmpty()); System.out.println("isEmptyString.isEmpty:"+ isEmptyString.isEmpty());//System.out.println("nullString.isEmpty:" + nullString.isEmpty()); System.out.println("-----------------------------------------------------"); System.out.println("\"\".equals(blackString):"+"".equals(blackString)); System.out.println("\"\".equals(isEmptyString):"+"".equals(isEmptyString)); System.out.println("\"\".equals(nullString):"+"".equals(nullString)); System.out.println("-----------------------------------------------------"); System.out.println("blackString==null:"+ blackString==null); System.out.println("isEmptyString==null:"+ isEmptyString==null); System.out.println("nullString==null:"+ nullString==null); System.out.println("-----------------------------------------------------"); System.out.println("blackString.equals(isEmptyString):"+ blackString.equals(isEmptyString)); System.out.println("blackString == isEmptyString:"+ blackString== isEmptyString);}}
输出结果:
blackString: isEmptyString: nullString:null ----------------------------------------------------- blackString.getBytes().length:0 isEmptyString.getBytes().length:0 ----------------------------------------------------- blackString.isEmpty:true isEmptyString.isEmpty:true ----------------------------------------------------- "".equals(blackString):true "".equals(isEmptyString):true "".equals(nullString):false ----------------------------------------------------- blackString==null:false isEmptyString==null:false nullString==null:false ----------------------------------------------------- blackString.equals(isEmptyString):true blackString == isEmptyString:false
由上面的输出结果可以看得出以下几点
1、String nullString = null;
这种定义方式表示这个变量是没有被分配内存的,源码里面如果运行被注释掉的代码则会报空指针异常java.lang.NullPointerException的错误,由此可以证明内存并没有分配;
2、String isEmptyString = new String();
这种定义方式会给isEmptyString变量分配出相应的内存,而由于new String()中的参数为空,则其实质上是一个有分配内存,但是值为空的一个变量;
3、String blackString = "";
这种定义方式和前者new String()的定义方式同样的都会分配出内存给这个变量,但与之不同的是,这种定义方式较之前者而言,相当于是new String("")定义的,拥有了参数(即调用了不同的构造方法)之后,blackString则是一个既有内存分配又有值(这个值是一个空的字符串)的变量。
由此大致能够让大家区分了一下这三者之前的区别和联系,希望对大家今后敲代码的过程中有所帮助!谢谢大家!
感谢这个我知道道友的提醒,上述测试代码存在个小BUG,位于
System.out.println("blackString==null:"+ blackString==null); System.out.println("isEmptyString==null:"+ isEmptyString==null); System.out.println("nullString==null:"+ nullString==null); System.out.println("-----------------------------------------------------"); System.out.println("blackString.equals(isEmptyString):"+ blackString.equals(isEmptyString)); System.out.println("blackString == isEmptyString:"+ blackString== isEmptyString);
由于运算符优先级的关系,+优先级大于==,因此blackString==null
、isEmptyString==null
、nullString==null
和blackString == isEmptyString
需要加括号提升优先级,而之前写的没加,导致测试结果有误,不好意思啦~
先摆个百科上的优先级图复习复习~
最后测试结果如下:
blackString: isEmptyString: nullString:null ------------------------------------ blackString.getBytes().length:0 isEmptyString.getBytes().length:0 ----------------------------------------------------- blackString.isEmpty:true isEmptyString.isEmpty:true ----------------------------------------------------- "".equals(blackString):true "".equals(isEmptyString):true "".equals(nullString):false ----------------------------------------------------- blackString==null:false isEmptyString==null:false nullString==null:true ----------------------------------------------------- blackString.equals(isEmptyString):true blackString == isEmptyString:false
区别在nullString==null:true
,之前错误的结果是false
,明鉴下啦~