一、類型
null表示的是一個對象的值,而並不是一個字符串。例如聲明一個對象的引用,String a = null ;
""表示的是一個空字符串,也就是說它的長度爲0。例如聲明一個字符串String str = "";
二、內存分配
Stringstr = null ; 表示聲明一個字符串對象的引用,但指向爲null,也就是說還沒有指向任何的內存空間;
String str =""; 表示聲明一個字符串類型的引用,其值爲""空字符串,這個str引用指向的是空字符串的內存空間;
""分配了內存,null沒有,調用null的字符串的方法會拋空指針異常(NullPointerException)。
""是一個字符串(String),它在內存中是存在的,它可以使用Object對象中的方法(如"".toString();"".equals())而null它是一個空對象,在內存中是不存在的,它不可以使用Object對象中的方法。
""佔內存,在內存中會分配一個空間。
null不佔內存,爲空引用。
在Java中變量和引用變量是存在棧中(stack),而對象(new產生的)都是存放在堆中(heap):
就如下:
String str = new String("abc") ;
ps:=左邊的是存放在棧中(stack),=右邊是存放在堆中(heap)。
三、"=="與".equal()"區別
"=="對兩個字符串作比較時,比較的是內存地址是否相等。
".equal()"是對兩個字符串對象的內容作比較,與地址無關。
比如以下代碼:
publicclass String_Demo {
publicstatic void main(String[] args){
String str1 = new String() ;
String str2 = null ;
String str3 = "" ;
System.out.println(str1==str2); //內存地址的比較,返回false
System.out.println(str1.equals(str2)); //值的比較,返回false
System.out.println(str2==str3); //內存地址的比較,返回false
System.out.println(str3.equals(str2)); //值的比較,返回false
System.out.println(str1==str3); //內存地址的比較,返回false
System.out.println(str1.equals(str3)); //值的比較,返回true
}
}
綜上,
- 字符串對象與null的值不相等,且內存地址也不相等;
- 空字符串對象與null的值不相等,且內存地址也不相等;
- 創建一個字符串對象的默認值爲""