Java中null和""的疑問

public class ArrToStr {
	static String str ;
	static String str1 = "";
	static String str2 = "";	
	public static void main(String[] args){
		System.out.println(str==str1);
		System.out.println(str instanceof Object);
		System.out.println(str1 instanceof Object);
		
		System.out.println(str);
		System.out.println("null".equals(str));
		System.out.println(str==null);
		
		System.out.println(str1.length());
		System.out.println(str1==str2);
	
		String str3 = "abc";
		String str4 = str3;
		String str5 = new String("abc");
		String str6 = new String("abc");
			    
	    System.out.println(str3==str4);
		System.out.println(str5==str6);
		System.out.println(str + str3);
	}
}
通過上述測試代碼分析:
  • 比較null和""的不同
  1. String str = null是指str這個變量指向空對象;而“”是一個包含空字符的字符串對象。
  2. str == str1返回false,因爲“”和null不在同一內存地址空間,也就是說,着兩個變量沒有指向同一對象。
  3. "null".equals(str)返回false。因爲空串的值不是“null”。
  4. 空串str1是可以調用String對象的方法的,比如str1.length()的值爲0;而str.length()將會拋出異常NullPointerException。
  • 比較==和equals的不同
  1. str3==str4返回true,因爲着兩個變量指向同一個對象"abc"(即內存中同一地址空間);而str==str6返回false,因爲用new在開闢了兩個不同的空間來存儲兩個“abc”對象,這樣着兩個變量所指向的地址就不同。
  2. equals指的是當字符串不爲空,並且字符串的值一樣時就返回true。
  • 爲什麼str打印出來是“null”?
我們查看PrintStream的源碼,其實Java在println的時候進行了處理:
public void print(String s) {
        if (s == null) {
            s = "null";
        }
        write(s);
    }

  • 爲什麼str+str3打印出來是“nullabc”?
String的相加實際是被處理成StringBuilder的append方法。好,再看StringBuilder的源碼,發現調用的是父類的方法:
 public StringBuilder append(String str) {
        super.append(str);
        return this;
    }
   public AbstractStringBuilder append(String str) {
        if (str == null) str = "null";
        int len = str.length();
        ensureCapacityInternal(count + len);
        str.getChars(0, len, value, count);
        count += len;
        return this;
    }

java運行過程中特殊的疑問一定不要輕易放過,查看源碼會找到答案。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章