版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/o0DarkNessYY0o/article/details/52526411
今天写个DEMO的时候碰到了个小麻烦,有关于题目所说的字符串这三者的区别,我觉得我真的是够了,居然会用得这么细,不过会了也好,碰到相关的问题就可以一言不合代码就开写!
既然研究,那就从结果说起,来看测试代码和输出结果:
// 测试代码
package cn.com.dnyy.sn;
public class CheckStringNull {
public static void main(String[] args) {
new CheckStringNull().start();
}
// 执行方法
public void start(){
String blackString = "";// 空字符串
String isEmptyString = new String();// 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则是一个既有内存分配又有值(这个值是一个空的字符串)的变量。
由此大致能够让大家区分了一下这三者之前的区别和联系,希望对大家今后敲代码的过程中有所帮助!谢谢大家!