java字符串三种空字符串null、new String()、””的区别

2022年6月8日10:05:39

      今天写个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则是一个既有内存分配又有值(这个值是一个空的字符串)的变量。

      由此大致能够让大家区分了一下这三者之前的区别和联系,希望对大家今后敲代码的过程中有所帮助!谢谢大家!


20190822修正

      感谢这个我知道道友的提醒,上述测试代码存在个小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==nullisEmptyString==nullnullString==nullblackString == isEmptyString需要加括号提升优先级,而之前写的没加,导致测试结果有误,不好意思啦~

      先摆个百科上的优先级图复习复习~
java字符串三种空字符串null、new String()、
      最后测试结果如下:

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,明鉴下啦~

  • 作者:o0DarkNessYY0o
  • 原文链接:https://blog.csdn.net/o0DarkNessYY0o/article/details/52526411
    更新时间:2022年6月8日10:05:39 ,共 4351 字。