1. 程式人生 > >Java進階(二十一)java 空字串與null區別

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:

      你可以這麼想,一個殘疾人,雖然他是殘疾的,但是他還是可以呼叫他的方法,他可以吃飯,但是如果這個人都不存在了,吃飯更無法執行了。

美文美圖