Java進階(二十一)java 空字串與null區別
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)。
3、示例程式:
public class String_Demo { /** * @param args */ public static 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的值不相等,且記憶體地址也不相等;
建立一個字串物件的預設值為"";
" "分配了記憶體 ;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.equals("")||str1==null){//如果str1沒有值,則....
//.....
}
正確的寫法是 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,因為他們的內容相同,都為空。
PS:
你可以這麼想,一個殘疾人,雖然他是殘疾的,但是他還是可以呼叫他的方法,他可以吃飯,但是如果這個人都不存在了,吃飯更無法執行了。