Java 进阶 (二十一)java 空字符串与 null 区别
一、类型
null
表示的是一个对象的值,而并不是一个字符串。例如声明一个对象的引用,String a = null ;
""
表示的是一个空字符串,也就是说它的长度为 0。例如声明一个字符串String str = "" ;
二、内存分配
String str = null ;
表示声明一个字符串对象的引用,但指向为null
,也就是说还没有指向任何的内存空间;
String str = "";
表示声明一个字符串类型的引用,其值为""
空字符串,这个 str 引用指向的是空字符串的内存空间;
在java
中变量和引用变量是存在栈中(stack
),而对象(new 产生的)都是存放在堆中。(heap
):
就如下:
String str = new String("abc") ;
ps:=左边的是存放在栈中(stack),=右边是存放在堆中(heap)。
三、示例程序
通过如上的程序可以得出如下结论:
字符串对象与
null
的值不相等,且内存地址也不相等;空字符串对象与 null 的值不相等,且内存地址也不相等;
创建一个字符串对象的默认值为"";
" "
分配了内存 ;null
没有;调用 null 的字符串的方法会抛空指针异常。
""是一个字符串(String),它在内存中是存在的。它可以使用 Object 对象中的方法(如
"".toString();"".equals())
。 而 null 它是一个空对象,在内存中是不存在的,它不可以使用 Object 对象中的方法。""占内存,在内存中会分配一个空间.;null 不占内存,为空引用。
String str1 = null; str1 引用为空;
String str2 = ""; str2 引用一个空串 。
也就是 null 没有分配空间,""分配了空间,因此 str1 还不是一个实例化的对象,而 str2 已经实例化。
注意因为 null 不是对象,""是对象。所以比较的时候必须是 if(str1==null){....}和 if(str2.equals("")){}
对象用 equals 比较,null 用等号比较。因此,如果 str1=null;下面的写法错误:
正确的写法是 if(str1==null||str1.equals("")){ //先判断是不是对象,如果是,再判断是不是空字符串
//...
}
四、补充说明
Java 里面,类的对象都是用句柄来访问的,就像 C 里面的指针。
而在 Java 里面有两个比较相等的方法一个是用“==
”,另一个是 String 里面的equals()
方法,两个的区别是,前者比较的是地址,后者比较的是内容。
例如你写了这样的一个语句
String str1,str2;
那就是定义了两个指向不同 String 实例的句柄,现在他们都是指向 null 的所以 str1==str2==null,此时你不能用 length()方法,因为,他们都没有指向具体的对象,如果调用这个方法的话,会返回一个 NullPointerException。之后,如果你写了这样的语句 str1=new String(); 那么 str1 将指向一个具体的 String 实例,所以 str1!=str2,str1!=null,而且更重要的是 str1!="",因为""与 str1 所指的是两个不同的地址。 但方法 str1.length()的返回值就是 0 了,也就是字符串为空。同样即使你再这样写 str2=new String(); 这个时候依然是 str1!=str2,因为他们指向的是两个不同的地址,但如果你用 str1.equals(str2)的话,返回值就是 true,因为他们的内容相同,都为空。
你可以这么想,一个残疾人,虽然他是残疾的,但是他还是可以调用他的方法,他可以吃饭,但是如果这个人都不存在了,吃饭更无法执行了。
版权声明: 本文为 InfoQ 作者【No Silver Bullet】的原创文章。
原文链接:【http://xie.infoq.cn/article/b322600aee3284025786d804d】。文章转载请联系作者。
评论