Java中null和“”(空字符串)的区别


null指的是一个空对象,这个对象可以是任何一个类的实例。

""指的是一个空字符串,这个字符串的长度为0。

也就是说null这个对象的类型可以是任何一个类型,而""这个对象的类型只能是String。

 

 

 

问题:java中空字符串和null的区别,如下题

String str1 = "";
String str2 = null;
String str3 = new String();
String str11 = "";
String str22 = null;
String str33 = new String();
System.out.println(str1 == str2); //false
System.out.println(str1 == str3); //false
System.out.println(str1 == str11); //true
System.out.println(str1.equals(str2)); //false
System.out.println(str1.equals(str3)); //true
System.out.println(str1.equals(str11)); //true
System.out.println(str2 == str3); //false
System.out.println(str2 == str22); //true
System.out.println(str2.equals(str22)); //报错,str2为空,空指针异常
System.out.println(str2.equals(str3)); //str2在前报错,改成如下格式
System.out.println(str3.equals(str2)); //false
System.out.println(str3 == str33); //false
System.out.println(str3.equals(str33)); //true

延伸问题:数据库如下图数据的一张存储用户信息的user表格,当从数据库中取出age=16的人的姓名name

 

 

 


//com.seven.www.findByAge = "SELECT name FROM user_info WHERE age = 16"
String userName = session.selectOne("com.seven.www.findByAge");
System.out.println(userName == ""); //false
System.out.println(userName == null); //false
System.out.println(userName.equals("")); //true
System.out.println(userName.equals(null)); //false


如果查询的是age=17的呢,结果如何呢?

//com.seven.www.findByAge = "SELECT name FROM user_info WHERE age = 17"
String userName = session.selectOne("com.seven.www.findByAge");
System.out.println(userName == ""); //false
System.out.println(userName == null); //true
System.out.println(userName.equals("")); //报错,空指针
System.out.println(userName.equals(null));


由以上延伸另一个写代码的好习惯,string类型判断变量是否与某个字符串相等时或者判断是否为空时,将变量放在equals里面,如:”“.equals(userName)。
判空的最好方法为:

if(userName == null || userName == "")


讲解下Java空字符串与null比较的原理:

1、类型
null表示的是一个对象的值,而并不是一个字符串。例如声明一个对象的引用,String a = null ;
“”表示的是一个空字符串,也就是说它的长度为0。例如声明一个字符串String str = “” ;

2、内存分配
String str = null ; 表示声明一个字符串对象的引用,但指向为null,也就是说还没有指向任何的内存空间;
String str = “”; 表示声明一个字符串类型的引用,其值为”“空字符串,这个str引用指向的是空字符串的内存空间;

在java中变量和引用变量是存在栈中(stack),而对象(new产生的)都是存放在堆中(heap):

就如下:

String str = new String(“abc”) ;

ps:=左边的是存放在栈中(stack),=右边是存放在堆中(heap)。

== 比较的是地址,方法 .equals()比较的是值
————————————————
版权声明:本文为CSDN博主「seven_cool」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/seven_cool/article/details/78470742


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM