在最近的后台开发中,遇到一个比较奇怪的需求。要求存储名称为“null”到数据库中,并用于查询和显示,所以根据个人的一些基础理解写了以下分析,不喜勿喷,共同学习。
一、“”和NULL分别是什么
Java中,null是一个关键字,是不确定的对象。但null本身并不是一个对象,也不是Object的实例;
String a = null;表示声明一个字符串对象的引用,它本身不占用任何地址空间;
而“”是一个空的字符串,在定义String a = “”;的时候已经给a分配了一块地址空间,就像C++中的指针;
public class StringTest {
/**
* @param args
* @author Hans
*/
public static void main(String[] args) {
String a = new String() ;
String b = null ;
String c = "" ;
System.out.print("a == b:");
System.out.println(a == b); //内存地址的比较,返回false
System.out.println("a.equals(b):" + a.equals(b));
System.out.print("b == c:");
System.out.println(b == c); //内存地址的比较,返回false
System.out.println("c.equals(b):" + c.equals(b));
System.out.print("a == c:");
System.out.println(a == c); //内存地址的比较,返回false
System.out.println("a.equals(c):" + a.equals(c));//值的比较,返回true
}
}
输出结果:
a == b:false
a.equals(b):false
b == c:false
c.equals(b):false
a == c:false
a.equals(c):true
输出结果验证以上三点!
三、null和“”的使用场景
String a = null;表示声明一个字符串对象的引用,它本身不占用任何地址空间;
而“”是一个空的字符串,在定义String a = “”;的时候已经给a分配了一块地址空间,就像C++中的指针;
二、验证观点
针对以上三点我们用一个Demo来进行描述:public class StringTest {
/**
* @param args
* @author Hans
*/
public static void main(String[] args) {
String a = new String() ;
String b = null ;
String c = "" ;
System.out.print("a == b:");
System.out.println(a == b); //内存地址的比较,返回false
System.out.println("a.equals(b):" + a.equals(b));
System.out.print("b == c:");
System.out.println(b == c); //内存地址的比较,返回false
System.out.println("c.equals(b):" + c.equals(b));
System.out.print("a == c:");
System.out.println(a == c); //内存地址的比较,返回false
System.out.println("a.equals(c):" + a.equals(c));//值的比较,返回true
}
}
输出结果:
a == b:false
a.equals(b):false
b == c:false
c.equals(b):false
a == c:false
a.equals(c):true
输出结果验证以上三点!
三、null和“”的使用场景
如果此变量在程序中后续是一个必须使用的变量,则定义为空字符串,即“”;
如果此变量不确定是否后续必须使用,则定义为null,让它不指定任何内存空间,如果这个对象就不再被任何对象应用,JVM垃圾回收机制会自动对其进行回收。
四、“”判断的常见错误写法
1,错误用法一:
if (a == "") {
}
2,错误用法二:
if (a.equals("")) {
}
if(a ! == null){
//判断空字符串及其他业务逻辑
}
或者比较好的写法
if (a! = null && !a.equals("")) {
//do something
}